这是我想做的事情:
typedef std::function<void(const callback&)> callback;
(即:定义一个std :: function,它可以作为第一个arg传递一个与自身相同类型的对象)。
然而,这不会编译(解析参数时不知道回调,即使编译器知道arg的大小,因为它是一个常量参考)
有没有人知道某种黑客(可能带有模板?)不如我使用的那种丑陋:
struct scallback;
typedef std::function<void(const scallback&)> callback;
struct scallback { callback value; };
它&#34;丑陋&#34;因为我必须直接使用arg.value而不是arg ..
注意:我必须使用std :: function而不是C-Like指针,以防止使用void *和cast。 感谢
鲍勃
答案 0 :(得分:2)
你是对的。此类型尚不清楚,因为尚未定义。它正处于被定义的中间。
您可以尝试从std::function<>
继承新类而不是对其进行类型别名。
您将能够在父类模板实例化中引用子类名称
与CRTP类似,感谢C ++ 11,您可以在一个简单的行中import all constructors。
#include <functional>
struct callback : std::function<void(const callback&)> {
using std::function<void(const callback&)>::function;
};
void test(const callback& cb) {}
int main() {
callback cb = test;
test(cb);
return 0;
}
答案 1 :(得分:1)
以下是我所看到的更好看的内容:
struct callback_arg;
typedef std::function<void(const callback_arg&)> callback;
struct callback_arg : callback // callback_arg can be seen as a callback
{
// callback can be seen as a callback_arg
callback_arg(const callback& a) : callback(a)
{
};
};
void Foo(const callback& val) {};
void Fuu(const callback& val) {};
int main()
{
callback foo = Foo;
callback fuu = Fuu;
foo(fuu); // compiles correctly
return 0;
}