1
#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 を使用していたため、コンパイル エラーが発生しました: error: no match for 'operator&' in 'serializer & tar'</p>

スペシャライゼーションを実現するには?

4

1 に答える 1

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)
{
}
于 2014-04-29T05:38:36.697 に答える