4

boost::is_convertibleしたがって、テンプレートの種類が次の場合に特定のコードを適用したいWellKnownType:

template <typename T>
class Foo {
public:
    Foo() {
        // apply specific function to m_t
        // if T is convertible to WellKnownType
    }
    T m_t;
};

このために、ファンクターを使用することを考えました:

template <typename T>
struct my_functor {
    void operator()(T& t) {
        // do nothing by default
    }
};

次に、次の場合に別のことを行うために、このファンクターを特殊化したいと思いますboost::is_convertible<T, WellKnownType>

template <>
struct my_functor<...> {
    void operator()(T& t) {
        // do something to t because it is convertible to WellKnownType 
    }
};

次に、ファンクターを使用するように定義を簡単に変更し、変換可能Fooな場合は何かを行い、そうでない場合は何もしないと思います。TWellKnownType

template <typename T>
class Foo {
public:
    Foo() {
        my_functor<T>()(m_t);
    }
    T m_t;
};

私が知らないのは、この動作を達成する方法です。については知ってBOOST_CONCEPT_REQUIRESいますが、それをテンプレートの特殊化に適用する方法がわかりません。何か助けはありますか?

4

3 に答える 3

4

ファンクターで次のようなことができます

template<typename T, typename WellKnownType >
struct my_functor
{
    void operator()( const T& x) { 
       myopImpl(x, boost::is_convertible<T, WellKnownType>() ); 
    }

    void  myopImpl(T const& x, boost::false_type) 
    {  std::cout << "Some Other Stuff \n";  }

    void  myopImpl(T const& x, boost::true_type)  
    { std:: cout << "Some Specific Stuff \n";  }

};

Demo here

于 2015-09-20T03:58:55.627 に答える