[英]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.