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

最大限度

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

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

这是这样调用的:

GlobalBind(aFunction, "aName", vm);

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

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

EDIT2:这个:

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

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

Yakk - Adam Nevraumont
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__

Nowconstant_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 );

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在将指针作为非类型模板参数传递给数据成员时,推断类型和类

Constexpr值作为指针类型的非类型模板参数

是否可以将指针作为非类型模板参数中的整数类型?

可以将`nullopt`作为非类型模板参数传递吗?

指针非类型模板参数

非类型模板参数中的占位符类型可以涉及作为模板参数传递的函数的重载解析吗?

非类型模板参数

带有继承的重载成员函数的指针的非类型模板参数

非类型模板参数允许各种函数类型?

std :: source_location作为非类型模板参数

使用数组元素作为非类型模板参数?

引用作为非类型模板参数

在构造函数中访问非类型模板参数

函数和继承中的非类型模板参数

具有非类型模板参数的构造函数

我可以将引用类型传递给模板以指定以下非类型模板参数的类型吗?

将非类型模板参数放入元组

模板非类型模板参数

指向(数据)成员的指针作为非类型模板参数,例如具有自动存储期限/无链接

从非类型模板参数确定类型

推断非类型模板参数的类型

可变参数函数模板,其参数作为模板非类型传递

将lambda参数完美转发到成员函数,其中成员函数是非类型模板参数

非类型模板参数的特化

非类型模板参数和要求

很多非类型模板参数

匹配可变参数非类型模板

非类型模板参数如何编译?

如何传递模板模板非类型成员函数指针?