使用boost enable_if无法匹配模板方法

时间:2014-04-29 03:51:52

标签: c++ boost operator-keyword sfinae 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>
    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,它给了我一个编译错误:     错误:与'serializer&amp;'中的'operator&amp;'不匹配焦油”

如何进行专业化?

1 个答案:

答案 0 :(得分:1)

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)
{
}