Ваша первая проблема в том, что void
- это тип, а не целое число.Вы можете заставить шаблон принимать два типа, вторым является либо boost::mpl::int_
или void
.
Затем вы можете либо специализировать всю структуру, либо вы можете поместить элемент данных в базовый класс и специализировать это..
#include <boost/mpl/int.hpp>
struct A {
A(int number) { /* use number */ } };
struct B { };
template <class T, class Value>
struct A_or_B_Holder_Base{
A_or_B_Holder_Base(): _t(Value::value) {}
protected:
T _t;
};
template <class T>
struct A_or_B_Holder_Base<T, void> {
A_or_B_Holder_Base(): _t() {}
protected:
T _t;
};
template <typename T, typename Value>
struct A_or_B_Holder : public A_or_B_Holder_Base<T, Value> {
};
using boost::mpl::int_;
A_or_B_Holder<A, int_<3> > x;
A_or_B_Holder<B, void> y;
A_or_B_Holder<A, void > w; //error, no default constructor
A_or_B_Holder<B, int_<3> > z; //error, no int constructor
Более естественным может быть не требовать, чтобы параметр был константой времени компиляции (так как в любом случае вы превращаете постоянную времени компиляции в переменную времени выполнения).Просто перегрузите конструктор.
struct A {
A(int number) { /* use number */ } };
struct B { };
template <typename T>
struct A_or_B_Holder {
A_or_B_Holder() : _t( ) { }
A_or_B_Holder(int number): _t(number) {}
private:
T _t;
};
A_or_B_Holder<B> b;
A_or_B_Holder<A> a(3);