无法使用提升enable_if匹配模板方法

Couldn't match the template method using boost enable_if

本文关键字:if 模板方法 enable      更新时间:2023-10-16
#include <boost/type_traits.hpp>
#include <boost/utility.hpp>
using namespace boost;
struct Serializable{};
struct Derived : Serializable {};
class Serializer
{
public:
    template <typename ValueType>
    void operator& (const typename enable_if<is_base_of<Serializable, ValueType>, ValueType>::type& value) {
        ;
    }
};
int main() {
    Serializer serializer;
    Derived tar;
    serializer & tar;
    return 0;
}

我使用g++4.4.7,这给了我一个编译错误:错误:"operator&"不匹配在'serializer&焦油

如何实现专业化?

operator &的右侧值应为ValueType类型。因此,使enable_if部分成为(假(结果类型:

#include <boost/type_traits.hpp>
#include <boost/utility.hpp>
using namespace boost;
struct Serializable{};
struct Derived : Serializable {};
class Serializer
{
public:
    template <typename ValueType>
    const typename enable_if<is_base_of<Serializable, ValueType>, ValueType>::type* operator& (ValueType &v)
    {
      return 0;
    }
};
int main() 
{
    Serializer serializer;
    Derived tar;
    int i = 1;
    serializer & tar; //ok
    serializer & i; //error
    return 0;
}

在C++11中,您还可以使enable_if构造一个默认的模板参数,这将使函数签名保持干净且未修改:

template <typename ValueType, typename = typename enable_if<is_base_of<Serializable, ValueType>, ValueType>::type>
void operator& (ValueType &v)
{
}