如何制作模板参数

时间:2016-05-14 21:29:20

标签: c++ templates metaprogramming function-pointers

如何创建一个带有任何函数指针的元函数?在下面的代码中,我如何摆脱" decltype(& f)" ?

template <class FuncType, FuncType functionPointer>
void runFunc()
{
    functionPointer();
}

runFunc<decltype(&f),f>();

我不想单独指定f的类型;信息已经存在于f中。我不想诉诸定义来解决这个问题。 这基本上是应用于元编程的模板化函数类型习惯用法;我不想知道f的类型,但无论我得到什么,显然都允许我在上面调用operator()。

我试过的东西:

模板参数的不同顺序;因为当你有一个函数时,后来的参数似乎是可猜测的;不可能因为那时你需要转发声明FuncType,以便将它作为functionPointer的类型

切换它以便指定返回类型和参数并给出该类型的函数指针;无法在中间实例化具有可变模板参数的模板;如下所示:

template <class ReturnType, class ... ArgTypes, ReturnType (*functionPointer)(ArgTypes...)>
void runFunc()
{
    functionPointer();
}

runFunc<void, int, f>(); // error; invalid template argument for 'ArgTypes', type expected

github上有更多上下文:https://github.com/TamaHobbit/FuncTest/blob/master/FuncTest/FuncTest.cpp

2 个答案:

答案 0 :(得分:3)

您可以使用:

template <typename FuncType>
void runFunc(FuncType functionPointer )
{
    functionPointer();
}

runFunc(f);

答案 1 :(得分:2)

现在很遗憾没有好办法。

然而,标准委员会已接受提出此有效代码的提案:

template <auto functionPointer>
void runFunc() {
  functionPointer();
}

编译器支持应该很快就会到来。