Tag: 函数对象

通过引用重载多个函数对象

在C ++ 17中,实现一个overload(fs…)函数是很简单的,给定任意数量的参数fs…满足FunctionObject ,返回一个新的函数对象 ,其行为类似于fs…的重载。 例: template <typename… Ts> struct overloader : Ts… { template <typename… TArgs> overloader(TArgs&&… xs) : Ts{forward<TArgs>(xs)}… { } using Ts::operator()…; }; template <typename… Ts> auto overload(Ts&&… xs) { return overloader<decay_t<Ts>…>{forward<Ts>(xs)…}; } int main() { auto o = overload([](char){ cout << "CHAR"; }, [](int) { cout << "INT"; }); o('a'); // […]

std :: function的模板参数是如何工作的? (实现)

在Bjarne Stroustrup的主页( C ++ 11 FAQ )中: struct X { int foo(int); }; std::function<int(X*, int)> f; f = &X::foo; //pointer to member X x; int v = f(&x, 5); //call X::foo() for x with 5 它是如何工作的? std :: function如何调用foo成员函数 ? 模板参数是int(X*, int) ,是从成员函数指针转换成非成员函数指针的 &X::foo ? (int(*)(X*, int))&X::foo //casting (int(X::*)(int) to (int(*)(X*, int)) 澄清:我知道我们不需要使用任何指针来使用std :: function […]

仿函数实际上比指向函数的速度快吗?

根据Scott Meyers的说法,C ++在C上的一个领域是函数对象比函数指针快。 他说这是因为函数对象是内联的,这会提高速度。 我有两个问题: 我们如何validation函数对象实际上是内联的呢? 我们可以在实践中validation这个吗? 函数对象的内联取决于我们使用的编译器,还是所有的编译器都像这样?