2010-05-22 76 views
0

我知道如何专门的模板功能,但我想在这里做的是专门的功能对于具有给定方法的所有类型,例如:C++创建通用模板函数特

template<typename T> void foo(){...} 

template<typename T, if_exists(T::bar)>void foo(){...}//always use this one if the method T::bar exists 

T ::我的类中的bar是静态的,并且具有不同的返回类型。我试着做一个空的基类(“类HasBar {};”)为我的类派生和使用boost :: enable_if与boost :: is_base_of在我的“专业化”版本。然而,问题则是,对于那些有酒吧,编译着决心使用:(哪一个类。

template<typename T> 
typename boost::enable_if<boost::is_base_of(HasBar, T>, void>::type f() 
{...} 

我知道我可以在“正常”的版本使用boost :: disable_if,但是我不要控制正常版本(它由第三方库提供,并且期望进行专门化,我只是不想为我的20个左右的类明确地进行专门化),我也没有太多的控制权使用这些函数的代码,只是实现T :: bar的类和使用它的函数。

是否有某种方法可以告诉编译器“在任何情况下始终使用此版本,如果可能的话”而不更改其他版本?

编辑:我尝试了使用模板类和显式专业化的不同方法,但显然这也是不允许的......无论如何要使这种方法工作?

template<typename T>class ImpFoo 
{ 
public: 
    //error C3637: 'foo' : a friend function definition cannot be a specialization of a function template 
    template<> friend void foo<T>(){...} 
}; 
... 
class SomeClass : public ImpFoo<T> 
{ 
... 
    SomeType bar(){...} 
}; 
+0

避免专门的功能模板。使用重载。有时,将函数作为类模板的静态成员进行封装很方便。这将允许你“特别专门化函数模板”(你会专注于类模板)。 – sellibitze 2010-05-22 12:19:33

+0

是一种可能的解决方法: 创建包装宏以将专门功能引导至实际实现。 '#define SPECIALIZE(class)template <> void function (){function(identity ()); }' – Anycorn 2010-05-22 15:29:36

+0

猜猜我可以看看,尽管id尽管可能是非宏观解决方案... – 2010-05-22 16:48:57

回答

2

可悲的是,你的运气了作为descriped这种情况下,你能做的最好的事情是明确专门的模板作为@aaa说。
由于您可以将这些专业化限制为简单转发到一个中央功能,因此20个类别的开销应该是可承受的。例如:

template<class T> my_foo() { /* do the actual work */ } 

template<> void foo<MyClass01>() { my_foo<MyClass01>(); } 
// ... 
template<> void foo<MyClass20>() { my_foo<MyClass20>(); }