2013-06-01 51 views
2

是否有可能拥有两个具有相同名称但不同类型模板参数的模板类 - 因此某种非类型模板参数负载机制?模板非类型参数过载

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宏,我必须为stub类拥有相同的模板非类型'重载'我有要执行的函数(我将不得不模板类而不是构造函数,它我当然可以重载,因为不可能显式声明构造函数模板参数,并且模板参数是非类型的,我也不能让它们推导出来)。

EDIT

指针到成员函数必须是一个编译时间值(一个非类型模板参数),因为它会被裹在一个非模板静态方法,其然后可以被存储在运行时可用的std :: vector中。

+0

请问功能相同,而不是类为更多的乐趣;-)你的目标是可以实现一些部分专业化,但不是那直接。 –

+0

但是乐趣在哪里呢? ;-)你将如何解决使用部分专业化(因为你不能专门化一个非类型的模板参数)。 –

+0

你可以专注于decltype(F)。所以你可以使用'Storage :: '(如果你需要C++ 03版本,有一些技巧)。 –

回答

0

这并不完全清楚你想要解决什么问题。如果你只是想让你的例子工作,你可以将'bool'改为'const bool &'。这是否达到你想要的?

template <typename T, typename U, void (T::*F)(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>(); } 
}; 

Storage<Foo, bool, &Foo::foo> foo; 
Storage<Bar, const bool&, &Bar::bar> bar;