我知道如何专门的模板功能,但我想在这里做的是专门的功能对于具有给定方法的所有类型,例如: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(){...}
};
避免专门的功能模板。使用重载。有时,将函数作为类模板的静态成员进行封装很方便。这将允许你“特别专门化函数模板”(你会专注于类模板)。 – sellibitze 2010-05-22 12:19:33
是一种可能的解决方法: 创建包装宏以将专门功能引导至实际实现。 '#define SPECIALIZE(class)template <> void function(){function(identity ()); }' –
Anycorn
2010-05-22 15:29:36
猜猜我可以看看,尽管id尽管可能是非宏观解决方案... – 2010-05-22 16:48:57