C++ C++;11:typedef std::函数和参数本身

C++ C++;11:typedef std::函数和参数本身,c++,c++11,typedef,forward-declaration,std-function,C++,C++11,Typedef,Forward Declaration,Std Function,以下是我想做的: typedef std::function<void(const callback&)> callback; typedef std::函数回调; (即:定义一个std::函数,该函数可以作为第一个参数传递与自身类型相同的对象) 但是,这不会编译(在解析参数时不知道回调,即使编译器知道参数的大小,因为它是常量ref) 是否有人知道某种比我使用的更不难看的黑客(可能是模板?): struct scallback; typedef std::function

以下是我想做的:

typedef std::function<void(const callback&)> callback;
typedef std::函数回调;
(即:定义一个std::函数,该函数可以作为第一个参数传递与自身类型相同的对象)

但是,这不会编译(在解析参数时不知道回调,即使编译器知道参数的大小,因为它是常量ref)

是否有人知道某种比我使用的更不难看的黑客(可能是模板?):

struct scallback;
typedef std::function<void(const scallback&)> callback;
struct scallback { callback value; };
struct scallback;
typedef std::函数回调;
结构scallback{callback value;};
这很难看,因为我必须使用arg.value,而不是直接使用arg

注意:我必须使用std::function,而不是类似C的指针,以防止使用void*和cast。 谢谢


鲍勃

以下是我所拥有的似乎更好一些的:

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;
}
struct回调参数;
typedef std::函数回调;
结构回调参数:回调//回调参数可以看作回调
{
//回调可以看作是回调参数
回调参数(常量回调&a):回调(a)
{
};
};
void Foo(const callback&val){};
void Fuu(const callback&val){};
int main()
{
回调foo=foo;
回调fuu=fuu;
foo(fuu);//编译正确
返回0;
}

你说得对。目前还不知道该类型,因为它尚未定义。只是在定义的中间。

您可以尝试从
std::function
继承一个新类,而不是对其进行类型别名。 您将能够在父类模板实例化中引用子类名称 与C++11类似,并且多亏了C++11,您将能够在一个简单的行中使用它

这:

#包括
结构回调:std::function{
使用std::function::function;
};
无效测试(const callback&cb){}
int main(){
回调cb=测试;
试验(cb);
返回0;
}

出于好奇,什么样的回调将自身作为参数?如果您得到了想要的,那么第一行将导致无休止的递归typedef…如果您试图向前声明一个结构,
const struct scallback&
就可以了。但是我不明白为什么你需要它是相同的名字。我闻到一个X和Y问题。@Cameron:回调不会调用自身,但会调用另一个相同的对象type@Read警告:可以定义一个类a,其函数成员将常量类a(或a*)作为参数,但不能测试继承构造函数,因为我使用gcc 4.6.3<4.8-但您的解决方案似乎是最好的:)
#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;
}