我有一个带有可变参数的函数模板,我想将其实例化用作模板参数。
template <typename... Args>
constexpr auto foo (Args&&... args) noexcept {
...
}
某处:
class X {
public:
using myFoo = int (foo)<int,int,int>(int,int,int)
X() {
// I would like to have something like that
call<myFoo>();
}
template <typename op>
auto call () {
return op(1,2,3);
}
};
编译器不接受上面的这段代码。是否可以为函数声明别名并将其用作模板参数?
你可以将其设为非捕获 lambda
constexpr auto foo = [/*no-capture*/](auto &&...args) noexcept {};
然后应用
static_cast<R(*)(Targs...)>
。这可以避免重复Targs
:
constexpr static auto myfoo = static_cast<int(*)(int,int,int>(foo);
或者,我们可以将其定义为初始化为 lambda 的模板变量,以摆脱返回类型:
template <typename ... targs>
constexpr auto foo = [/*no-capture*/](targs &&... vargs) noexcept {};
constexpr static auto myfoo = foo<int, int, int>;
但这使得对原始函数的调用变得冗长:
template <typename ... targs>
constexpr decltype(auto) callfoo(targs &&... vargs) noexcept
{ return foo<targs...>(std::forward<targs>(vargs)...); };
但最简单的是指向themplate函数的特定实例的指针:
constexpr auto foo(auto &&... vargs) noexcept {};
constexpr static auto* my_foo_ptr = foo<int,int,int>;