簡體   English   中英

C ++非類型模板,用於函數指針/引用的模板

[英]C++ non-type template template to function pointer/ref

在C ++ 11中是否可能發生這種情況? 我想將模板化函數指針/ ref作為非類型模板參數傳遞:

template <template <typename ... TRest> void (*request_suffix)(ATCommander&, TRest...)>
struct command_helper
{
    template <class ...TArgs>
    static void request(ATCommander& atc, TArgs...args)
    {
        command_base::prefix(atc);
        request_suffix(atc, args...);
    }
};

具體來說,request_suffix的用法? 如果是這樣,是否還可以轉儲TArgs的內容?

我計划然后做類似的事情:

// dummy example code, but very closely representative of the kind
// of thing we'll be doing
void specific_request_suffix(ATCommander& atc, const char* p1, int p2)
{
    cout << p1;
    cout << p2;
}

typedef command_helper<specific_request_suffix> command;

command::request(atc, "test param1", 7); // or similar

重要的是,發出time命令::: request時,不需要對specific_request_suffix的特定引用。 另外,我在嵌入式環境中,因此std :: function不一定可用

我使用decltype來推斷類型。 它看起來像hack,但令人驚訝的是它可以工作。 請參見下面的實現:

void specific_request_suffix(ATCommander& atc, const char* p1, int p2)
{
    cout << p1;
    cout << p2;
}

template<typename T, T *t, typename... Args>
    struct command_helper
    {
        static T *func_ptr;
        static void Request(ATCommander &cmd, Args... args)
        {
            func_ptr(cmd, args...);
        }
    };

template<typename T, T *t, typename... Args>
    T *command_helper<T, t, Args...>::func_ptr = t;

template<typename T, T *t, typename... Args>
    command_helper<T, t, Args...> infer_command_helper(void(*f)(ATCommander&, Args...)) {}

template<typename T, T *t>
    struct command_type
    {
        using type = decltype(infer_command_helper<T, t>(t));
    };

using command = command_type<decltype(specific_request_suffix), specific_request_suffix>::type;

void Task()
{
    ATCommander cmd = 5;
    command::Request(cmd, "h", 10);
    cout << endl;
}

注意,在using聲明的命令類型中,函數名稱必須使用兩次。 我不知道如何避免:(

這個答案說不可能從非類型模板參數推斷類型:

由於您是在詢問沒有宏定義幫助的基於純類模板的解決方案,因此答案很簡單:就目前(2014年12月,C ++ 14)而言,這是不可能的。

WG21 C ++標准委員會已經確定需要解決此問題,並且有一些建議讓模板自動推斷非類型模板參數的類型。

由於我們需要從函數指針中獲取函數類型以簡化命令聲明,因此我傾向於得出這樣的結論:直到下一種語言標准才有可能。

上一次嘗試

這是我的第一次嘗試,但不能滿足所有要求。 如果對某人有用,請將其保留在此處。

template <typename... Rest>
struct command_helper
{
    using TFunc = std::function<void(ATCommander&, Rest...)>;

    static void request(ATCommander &cmd, TFunc func, Rest... rest)
    {
        func(cmd, rest...);
        cout << "Hello in template " << endl;
    }
};

現在您可以按以下方式使用它:

using ATCommander = int;

auto f=[](ATCommander& cmd, int version, double d)
{
    cout << "In lambda " << cmd << " version " << version << " d= " << d;
};

ATCommander cmd = 5;
command_helper<int, double>::request(cmd, f, 1, 0.5);

暫無
暫無

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

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