2

以下のコードでは、 Foo<T>::setValuewhereTTYPEegBar::TYPEおよびBaz:TYPE.

Foo<T>::setValueしたがって、名前を付けずに特殊化するのを助けていただき、Barand Baz、そのようなクラスが数十ある可能性があるためです。

class Bar
{
public:
    enum TYPE{ ONE , TWO };
};

class Baz
{
public:
    enum TYPE{ SIX , TEN };
};

template<typename T>
class Foo
{
public:
    void setValue(){} // Need a different setValue if T is a class enum

private:
    T m_value;
};


int main()
{
    Foo<int> f1;
    Foo<Bar::TYPE> f2;
    Foo<Baz::TYPE> f3; 
    return EXIT_SUCCESS;
}
4

2 に答える 2

6

次のような方法でこれを行うことができます。

#include <type_traits>

template<typename T>
class Foo
{
public:
    void setValue() {
      setValueImpl<T>();
    }
private:
    template <class X>
    typename std::enable_if<std::is_enum<X>::value, void>::type
    setValueImpl() { std::cout << "Is enum" << std::endl; }

    template <class X>
    typename std::enable_if<!std::is_enum<X>::value, void>::type
    setValueImpl() { std::cout << "Not enum" << std::endl; } 

    T m_value;
};

Whereは、型特性enable_ifに基づいて使用するバージョンを選択します。is_enum

この例では C++11enable_ifを使用しis_enumましたが、boost は C++11 よりも前のバージョンでも同様です。

于 2012-05-11T13:51:44.210 に答える