调用模板仿函数的语法更简单

Simpler syntax to invoke a template functor

我有一个看起来像这样的仿函数:

struct Functor {
  template<typename T, typename... Args> static void func( Args&&... args );
};

我需要将它作为模板参数传递给一个函数,这个函数会调用它:

template<typename F> void fn() {
  F::template func<int>(1, 2, 3);
}
fn<Functor>();

不得不写 F::template func<int> 感觉很乏味,而且我需要在许多不同的函数中多次调用它。我希望能够写一些更简洁的东西,比如 F<int>(1, 2, 3).

有什么办法可以美化一下吗?

您可以修改F如下

template <typename T>
struct Functor {
  template<typename... Args> void operator() ( Args&&... args );
};

并在 fn()

中接收 F 作为模板模板参数
template <template <typename> class F>
void fn ()
 { F<int>{}(1, 2, 3); }

fn<Functor>();

但我不知道这是否是个好主意:您减少了打字但需要一个 F<int> 的实例,而使用静态方法不需要它。

另一种选择是让所有模板都可推导,例如:

template <typename> struct tag{};

struct Functor {
  template<typename T, typename... Args> static void func(tag<T>,  Args&&... args );
};

因此,用法类似于:

template<typename F> void fn() {
  F::func(tag<int>{}, 1, 2, 3);
}
fn<Functor>();