r*********r 发帖数: 3195 | 1 boost::function f;
这句的template argument 的 syntax: bool (int) 看着很怪, 为什么是合法的呢?
这能表示一个 type 吗? |
r*********r 发帖数: 3195 | |
r*********r 发帖数: 3195 | 3 看了. boost 的源码都在那儿. 不过没看出来trick 在哪儿.
有本书上说这是 legal c++, but not all compilers support it.
c++ 有这个 syntax 吗? |
r*********r 发帖数: 3195 | 4 但是 c++ 里不能用
typedef bool (int) *fp;
只能用
typedef bool (*fp) (int); |
r*********r 发帖数: 3195 | 5 这个应该跟库没有关系, 是c++的性质.
试了一个, 下面的可以编译.
template
class foo { };
int main()
{
foo f;
return 0;
} |
r*********r 发帖数: 3195 | 6 搞定了, bool (int) 是 function 类型, 而不是 function pointer 类型.
下面的小程序中 T *t_ 如果换成了 T t_ 就不能编译.
#include
template
class foo {
T *t_;
public:
foo(T *t) : t_(t) {}
void call(int n) { std::cout << (*t_)(n) << std::endl; }
};
bool bar(int x) { return x == 0; }
int main()
{
foo f(&bar);
f.call(0);
return 0;
} |
b********n 发帖数: 609 | 7 right, it's type erasure. I forgot it after so long.
【在 r*********r 的大作中提到】 : 搞定了, bool (int) 是 function 类型, 而不是 function pointer 类型. : 下面的小程序中 T *t_ 如果换成了 T t_ 就不能编译. : #include : template : class foo { : T *t_; : public: : foo(T *t) : t_(t) {} : void call(int n) { std::cout << (*t_)(n) << std::endl; } : };
|