Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;非类型模板模板到函数指针/ref_C++_Templates - Fatal编程技术网

C++ C++;非类型模板模板到函数指针/ref

C++ C++;非类型模板模板到函数指针/ref,c++,templates,C++,Templates,在C++11中是否可以实现类似的功能?我想将模板化函数指针/ref作为非类型模板参数传入: template <template <typename ... TRest> void (*request_suffix)(ATCommander&, TRest...)> struct command_helper { template <class ...TArgs> static void request(ATCommander&

在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...);
    }
};
模板
结构命令辅助程序
{
模板
静态无效请求(ATCommander&atc、TArgs…args)
{
命令库::前缀(atc);
请求_后缀(atc、args…);
}
};
具体来说,请求_后缀的用法是什么?如果是这样,是否也可以倾倒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
//伪示例代码,但非常接近此类代码的代表性
//我们将要做的事情
无效特定请求后缀(ATCommander&atc,const char*p1,int p2)
{

cout我使用了
decltype
来推断类型。它看起来像是一个黑客,但出人意料的是它可以工作。请参见下面的实现:

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 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);
使用ATCommander=int;
自动f=[](ATCommander&cmd,整数版本,双d)
{

难道不存在非类型模板参数吗?您可以使用一个带有单个(非模板)静态方法的类模板来代替。@IgorTandetnik请参考我的意思,我指的是非类型模板参数(您尝试使用
请求\u后缀
)-确实没有这样的事情。你可以传递一个函数指针作为模板参数,但你不能传递一个完整的函数指针族。但是,你可以传递一个类(作为类型参数),该类可以有一个成员函数模板;或者传递一个类模板(作为模板参数)这可能有一个成员函数。这两个函数中的任何一个都可以实现将一系列函数传递给模板的目标。很聪明,但正如你预测的那样,我不认为它涵盖了我的用例。我已经更新了我的原始帖子,我将试验你的解决方案在你的示例中,什么类型是
特定的请求后缀
w您对
decltype
解决方案的看法。要尝试一下,这肯定是一个解决方案,但比我希望的要详细一点。我会坚持等待一个神奇的子弹,但如果没有,这将是公认的答案。我更新了答案,添加了指向另一个问题的链接和引用。这似乎不可能简化命令类型声明还包括:(
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);