函数模板作为别名

问题描述 投票:0回答:1

我有一个带有可变参数的函数模板,我想将其实例化用作模板参数。

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

编译器不接受上面的这段代码。是否可以为函数声明别名并将其用作模板参数?

c++ templates
1个回答
0
投票

你可以将其设为非捕获 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>;
© www.soinside.com 2019 - 2024. All rights reserved.