C++ 调用模板函子的更简单语法

C++ 调用模板函子的更简单语法,c++,templates,functor,C++,Templates,Functor,我有一个函子,看起来像这样: struct Functor { template<typename T, typename... Args> static void func( Args&&... args ); }; 结构函子{ 模板静态无效函数(参数&&…参数); }; 我需要将其作为模板参数传递给函数,该函数调用它: template<typename F> void fn() { F::template func<int>(

我有一个函子,看起来像这样:

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>();
模板无效fn(){
F::模板函数(1,2,3);
}
fn();
必须编写
F::template func
感觉很乏味,我需要在许多不同的函数中多次调用它。我希望能够写一些更简洁的东西,比如
F(1,2,3)


有什么方法可以粉饰它吗?

您可以修改
F
,如下所示

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

但是我不知道这是否是个好主意:你可以减少打字,但是需要一个使用静态方法不需要的
F
实例。

你可以如下修改
F

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

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

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

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>();
模板无效fn(){
F::func(tag{},1,2,3);
}
fn();

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

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>();
模板无效fn(){
F::func(tag{},1,2,3);
}
fn();

好主意!为什么创建
F
的实例会有问题?我相信编译器会对它进行优化。我会试着玩一会儿,如果我决定使用它,我会接受答案:)切换到
operator()
是没有必要的,顺便说一句,
F::func(1,2,3)
。(即使对函子使用
操作符()
也是很常见的)。好主意!为什么创建
F
的实例会有问题?我相信编译器会对它进行优化。我会试着玩一会儿,如果我决定使用它,我会接受答案:)切换到
operator()
是没有必要的,顺便说一句,
F::func(1,2,3)
。(即使对函子使用
运算符()
也是常见的)。