C ++创建通用模板函数特化

时间:2010-05-22 10:25:26

标签: c++ templates template-specialization

我知道如何专门化模板函数,但是我想要做的是为所有具有给定方法的类型专门化一个函数,例如:

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。然而问题是,对于具有bar的类,编译器无法解析使用哪一个:(。

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(){...}
};

1 个答案:

答案 0 :(得分:2)

遗憾的是,你在这种情况下运气不佳,你可以做的最好的事情就是明确专门化模板,如@aaa所说。
由于您可以将这些特化限制为简单转发到一个中心函数,因此20个类的开销应该是可以承受的。 E.g:

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

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