调用模板仿函数的语法更简单
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>();
我有一个看起来像这样的仿函数:
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>();