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)
。(即使对函子使用运算符()
也是常见的)。