【问题标题】:C++11 : typedef std::function and argument on itselfC++11:typedef std::function 和自身的参数
【发布时间】:2014-11-18 19:20:56
【问题描述】:

这是我想做的:

typedef std::function<void(const callback&)> callback;

(即:定义一个 std::function 可以作为第一个参数传递一个与其自身相同类型的对象)。

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

有没有人知道某种 hack(可能使用模板?)比我使用的那个更丑:

struct scallback;
typedef std::function<void(const scallback&)> callback;
struct scallback { callback value; };

这很“丑陋”,因为我必须使用 arg.value 而不是直接使用 arg..

注意:我必须使用 std::function 而不是 C-Like 指针,以防止使用 void* 和强制转换。 谢谢

鲍勃

【问题讨论】:

  • 出于好奇,什么样的回调将自己作为参数?
  • 如果你得到了你想要的,你的第一行将导致无穷无尽的递归 typedef...
  • 如果你试图转发声明一个结构,const struct scallback&amp; 就可以了。但是我不明白为什么你需要它是同一个名字。我闻到了 X 和 Y 问题。
  • @Cameron : 回调不会调用自己,而是调用另一个相同类型的对象
  • @Read Alert:可以定义一个类 A,其函数成员以 const 类和 A(或 A*)为参数

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


【解决方案1】:

你是对的。该类型目前尚不清楚,因为它尚未定义。它只是在被定义的中间。

您可以尝试从std::function&lt;&gt; 继承一个新类,而不是对其进行类型别名。 您将能够在父类模板实例化中引用子类名称 类似于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;
}

【讨论】:

  • 无法测试继承构造函数,因为我使用 gcc 4.6.3
【解决方案2】:

这是我所拥有的,看起来更好一些:

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

【讨论】:

    猜你喜欢
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    相关资源
    最近更新 更多