c++ - 将函数指针作为非类型模板参数传递

标签 c++ templates function-pointers

我有这个模板函数,它运行良好:

    template<typename RES, typename... PARMS> SQInteger GlobalBind(RES(*fn)(PARMS... parms), const char *sqName, HSQUIRRELVM v)

这样调用:

GlobalBind(aFunction, "aName", vm);

它的范围是将函数 fn 绑定(bind)到脚本引擎。

以这种方式使用它,我必须在脚本引擎中保留fn 指针和代理模板指针;代理模板(此处未显示)以 fn 作为参数调用,执行一些操作,然后调用 fn

我想要实现的是从函数调用中删除 fn 指针,并将其作为参数放入模板中,如下所示:

template<typename RES, typename... PARMS, RES(*fn)(PARMS...)> SQInteger GlobalBind(const char *sqName, HSQUIRRELVM v)

因此,为每个不同的fn实例化一个特定的模板,这意味着我可以避免脚本语言中的fn指针;电话应该是:

GlobalBind<aFunction>("aName", vm);

模板声明被编译器接受,但是调用带来了错误,甚至在aFunction之前添加了参数类型,就像这样(假设aFunction返回并且 int 并且有 const char * 作为参数):

GlobalBind<int, const char *, aFunction>("aName", vm);

有没有办法实现这个结果(前者,没有参数列表)?

编辑: 为了简化问题,就是模板

template<typename RES, typename... PARMS, RES(*fn)(PARMS...)> RES TEST(PARMS... parms) {
    return fn(parms...);
}

一个有效的?如果是的话……应该怎么调用它? 我试过这个:

int testfn(const char *s) { return strlen(s); }
TEST<testfn>("aString");   << ERROR
TEST<int, const char *, testfn>("aString");  << ERROR

编辑2: 这个:

template<int (*fn)(const char *)> int TEST2(const char *s) {
    return fn(s);
}
TEST2<testfn>("aString");

有效,但对我的目的没有用

最佳答案

template<class T, T t>
struct constant_t:std::integral_constant<T,t>{
  constexpr operator T()const { return t; }
  constexpr constant_t(){}
};

#define TYPEDARG(...) \
  typename std::decay<decltype(__VA_ARGS__)>::type, \
  __VA_ARGS__

现在constant_t<TYPEDARG(foo)>是一种类型,如果 foo 可以调用其实例是一个非重载函数,他们调用 foo .

这变成:

template<auto x>
using constant_t=std::integral_constant<std::decay_t<decltype(x)>,x>;

使用很简单constant_t<foo> ,没有所有额外的噪音。

template<class Fn, class R, class... Args>
R test(Args&&... args) {
  return Fn{}(std::forward<Args>(args)...);
}

int foo( int a, int b ) { return a+b; }

int r = test< constant_t<TYPEDARG(foo)>, int, int, int >( 3, 4 );

关于c++ - 将函数指针作为非类型模板参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47275699/

相关文章:

c++ - 类中 C++ 运算符重载的语法

c++ - 模板类中的c++运算符重载Im正在尝试构建重载<<以打印树

c++ - 用于在两个函数之间进行选择的仿函数

c++ - 如何从许多函数中获取函数指针并将args传递给它?

c++ - 内联函数指针以避免 if 语句

c++ - 重写运算符多个参数

c++ - 如何释放在 C++ 中加载的 DotNet 程序集

c++ - 模板化运算符重载的奇怪错误

c++ - 覆盖 [[noreturn]] 虚函数

c++ - 从 C++ 中的 OGR 错误读取