C ++ 11:typedef std :: function和自身的参数

时间:2014-11-18 19:20:56

标签: c++ c++11 typedef forward-declaration std-function

这是我想做的事情:

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。 感谢

鲍勃

2 个答案:

答案 0 :(得分:2)

你是对的。此类型尚不清楚,因为尚未定义。它正处于被定义的中间。

您可以尝试从std::function<>继承新类而不是对其进行类型别名。 您将能够在父类模板实例化中引用子类名称 与CRTP类似,感谢C ++ 11,您可以在一个简单的行中import all constructors

seems to work

#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;
}