是否可以有两个具有相同名称但不同的非类型模板参数的模板类 - 因此某种非类型模板参数重载机制?
template <typename T, typename U, void (T::*F)(U)> void common() { ... }
template <typename T, typename U, void (T::*F)(const U &)> void common() { ... }
struct Foo
{
void foo(bool) {}
}
struct Bar
{
void bar(const bool &) {}
}
template <typename T, typename U, void (T::*F)(U)> struct Storage
{
Storage() { common <T, U, F>(); }
}
template <typename T, typename U, void (T::*F)(const U &)> struct Storage
{
Storage() { common <T, U, F>(); }
}
Storage<Foo, bool, &Foo::foo> foo;
Storage<Bar, bool, &Bar::bar> bar;
拥有这种机制的原因是两者都应该能够使用相同的宏来创建。
#define STORAGE(T, U, F) Storage<T, U, F> BOOST_PP_CAT(storage, __LINE__);
STORAGE(Foo, bool, &Foo::foo)
STORAGE(Bar, bool, &Bar::bar)
感谢您的输入!
编辑
可能一些进一步的输入是有帮助的。
我想要实现的是在初始化时运行的方法。我可以提供这样一种方法——或者更好地说是两种重载方法,一种使用 const-ref,一种使用 value-member-function-pointer;但是要在初始化时执行它们,我通常会有一个存根类(如本例中的 Storage),它在其构造函数中调用此方法(因此在初始化时,因为 STORAGE 宏创建存根类的实例)。
要使用相同的 STORAGE 宏,我必须为要执行的函数的存根类使用相同的模板非类型“重载”(并且我必须对类而不是构造函数进行模板化,我当然可以重载,因为不可能显式声明构造函数模板参数,并且由于模板参数是非类型的,所以我也不能推导出它们)。
编辑
指向成员函数的指针必须是编译时值(非类型模板参数),因为它将包装在非模板静态方法中,然后可以将其存储在运行时可用的 std::vector 中。