Самый простой способ обеспечить специализацию шаблона для производных классов - PullRequest
4 голосов
/ 03 июня 2010

У меня есть следующий сценарий:

class my_base { ... }

class my_derived : public my_base { ... };


template<typename X>
struct my_traits.

Я хочу специализировать my_traits все классы, производные от my_base, в том числе: т.е.

template<typname Y> // Y is derived form my_base.
stryct my_traits { ... };

У меня нет проблем, чтобы добавить какие-либо теги, члены my_base, чтобы сделать его проще. Я видел какой-то трюк, но я все еще чувствую себя потерянным.

Как это можно сделать простым и коротким путем?

1 Ответ

2 голосов
/ 03 июня 2010

Ну, вам не нужно писать свой собственный isbaseof. Вы можете использовать boost или c ++ 0x.

#include <boost/utility/enable_if.hpp>

struct base {};
struct derived : base {};

template < typename T, typename Enable = void >
struct traits;

template < typename T >
struct traits< T, typename boost::enable_if<std::is_base_of<base, T>>::type >
{
  enum { value = 5 };
};

#include <iostream>
int main()
{
  std::cout << traits<derived>::value << std::endl;

  std::cin.get();
}

Есть проблемы с масштабированием, но я не верю, что они лучше или хуже, чем альтернатива в другом вопросе.

...