传递静态成员函数作为模板参数
Pass static member function as template parameter
template<typename T> struct A
{
static T x(T, T) { }
static T y(T, T) { }
};
template<typename T> struct B
{
static T x(T, T) { }
static T y(T, T) { }
};
struct Dispatcher
{
template<template<typename> class TC, ??? TStaticFunc,
typename T1, typename T2>
static std::common_type_t<T1, T2> call(T1 mI, T2 mJ)
{
return TC<std::common_type_t<T1, T2>>::*TStaticFunc(mI, mJ);
}
};
Dispatcher::call<A, x>(12.f, 5);
Dispatcher::call<B, x>(1.f, 51);
Dispatcher::call<A, y>(2.f, 25);
Dispatcher::call<B, y>(5.f, 3);
是否有可能创建一个像Dispatcher::call
一样工作的模板化函数?我想分别传递类类型和静态函数名。
或者通过A<..:>::x
是实现这种调度的唯一可能方法吗?
如果你真的,真的,真的想的话,你可以做到的。您只需为每个静态函数名定义一个类型、一个函数或一个变量(基本上是编译时唯一的东西)。这是其中一个选项:
namespace detail
{
template <typename T>
struct x
{
static decltype(&T::x) get() { return &T::x; }
};
template <typename T>
struct y
{
static decltype(&T::y) get() { return &T::y; }
};
// etc, you can use macros here to avoid boilerplate
}
现在改变Dispatcher
一点…
struct Dispatcher
{
template<template<typename> class TC, template<typename> class FuncGetter,
typename T1, typename T2>
static typename std::common_type<T1, T2>::type call(T1 mI, T2 mJ)
{
typedef TC<typename std::common_type<T1, T2>::type> T;
auto staticMemberFunc = FuncGetter<T>::get();
return staticMemberFunc(mI, mJ);
}
};
现在是下面的代码:
using namespace detail;
Dispatcher::call<A, x>(12.f, 5);
Dispatcher::call<B, x>(1.f, 51);
Dispatcher::call<A, y>(2.f, 25);
Dispatcher::call<B, y>(5.f, 3);
。如果您决定遵循此模式,我建议您将x
和y
更改为x_tag
或类似的内容。
或者,您可以直接编写一个宏来代替Dispatcher::call
。
相关文章:
- 用作默认参数的静态成员会导致无法解析的外部
- 在没有对象参数编译器错误的情况下调用非静态成员函数
- 私有静态成员可以用作其类的成员函数的默认参数吗
- boost::信号与来自静态成员函数的参数
- 不接受静态成员函数作为 constexpr 参数
- 静态成员函数指针作为模板参数
- 如何用功能指针作为参数初始化静态成员的模板
- 使用相同的参数重构静态成员函数
- 默认参数:在非静态成员函数之外无效使用'this'
- C++11:在类构造函数中使用非静态成员函数作为默认参数
- 如何初始化参数化模板类的静态成员
- 定义静态成员的默认参数
- 具有非类型参数的类模板的静态成员的 gdb "static field value has been optimized out"
- 调用非静态成员函数,没有对象参数错误
- 指向静态成员函数的指针"invalid"为 G++ 的模板参数
- 初始化使用模板参数作为类型的模板化类的静态成员?
- c++错误:调用没有对象参数的非静态成员函数
- C++通过将静态成员变量作为参数传递来初始化该变量
- 将静态成员函数作为参数传递
- 为什么不允许非静态成员的地址作为模板非类型参数