我知道如何专门化一个模板函数,但是我想在这里做的是专门为所有具有给定方法的类型的函数,例如:
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 是静态的,并且具有不同的返回类型。
我尝试通过为我的类派生一个空的基类(“class 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(){...}
};