簡體   English   中英

C ++ 11:typedef std :: function和自身的參數

[英]C++11 : typedef std::function and argument on itself

這是我想做的事情:

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

(即:定義一個std :: function,它可以作為第一個arg傳遞一個與自身相同類型的對象)。

但是這不會編譯(解析參數時不知道回調,即使編譯器知道arg的大小,因為它是const ref)

有沒有人知道某種黑客(可能有模板?)比我使用的那種更難看:

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

這是“丑陋的”因為我必須直接使用arg.value而不是arg ..

注意:我必須使用std :: function而不是C-Like指針,防止使用void *和cast。 謝謝

短發

你是對的。 此類型尚不清楚,因為尚未定義。 它正處於被定義的中間。

您可以嘗試從std::function<>繼承一個新類,而不是對它進行類型別名。 CRTP類似,您將能夠在父類模板實例化中引用子類名稱,並且由於C ++ 11,您將能夠在一個簡單的行中導入所有構造函數

似乎有效

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

這就是我所擁有的似乎更好的東西:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM