Gon*_*n I 3 c++ templates function-pointers
我试图了解函数类型<void()>和函数指针类型之间的区别<void (*)()>
stl::function可以通过 指向函数<void()>,但我似乎需要<void (*)()>在我自己的模板类中使用:
void f1() {
std::cout << "hi!\n";
}
template<class T> struct X
{
T t;
};
int main()
{
std::function<void()> f = f1; // stl handles this, and f is callable
f(); // OK
// X<void()> x; // compilation error - a member of a class template cannot aquire a function type
X<void (*)()> x2; // OK
x2.t = f1; // OK
x2.t(); // OK
return 0;
}
Run Code Online (Sandbox Code Playgroud)
函数类型(例如<void()>C++ 11 的新功能)是否与std::function?
我已经看到了一些关于此的其他问题,但没有找到对我来说很清楚的解释,并且在网上搜索 C++ 函数类型并没有产生令人满意的结果。
我将不胜感激任何明确的解释或对一个的引用。
函数类型对 C++11 来说根本不是新的:即使在 C 中也存在。但是,你不能拥有函数类型的对象,即,
template <typename T>
struct X {
T t;
};
X<void()> does_not_work;
X<void(*)()> works;
Run Code Online (Sandbox Code Playgroud)
但是,您可以将函数类型转换为指针类型:
template <typename T>
struct X {
T* t;
};
Run Code Online (Sandbox Code Playgroud)
在使用与调用不同的函数时,该函数会衰减为函数指针。将函数衰减为指针等效于获取函数的地址。
当然,std::function<...>无论如何它是完全不同的:它实际上定义了一个函数调用运算符。为此,它设计了一个通用模板并将其专门用于函数类型:
template <typename> class function;
template <typename R, typename... A>
class function<R(A...)> {
public:
R operator()(A...);
// ...
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |