Йоу. Есть следующее определение шаблонного класса:
template<
class Attribute1,
class Attribute2 = void,
class Attribute3 = void,
class Attribute4 = void
>
class Entity {
public:
typename Attribute1::Type _attribute1;
typename Attribute2::Type _attribute2;
typename Attribute3::Type _attribute3;
typename Attribute4::Type _attribute4;
};
При таком определении класс можно специализировать только четырьмя параметрами, каждый из которых должен быть классом, в котором определено имя Type. Число параметров 4 взято для примера. При реальном использовании шаблонных параметров может быть до 16.
Теперь о том, что хочется. Хочется, чтобы те члены _attributeN, для которых соответствующий шаблонный параметр AttributeN является void, убирались из определения класса. Иными словами, хочется, чтобы при специализации вида Entity< ConcreteAttribute1 >, код компилировался, и в классе был единственный член _attribute1; чтобы при специализации вида Entity< ConcreteAttribute1, ConcreteAttribute2 > в классе были только члены _attribute1 и _attribute2 и т.д. Возможно ли это осуществить каким-либо образом?
P.S.: несмотря на то, что смысл задачи состоит в описании кортежа, заменить её на использование std::tuple по некоторым причинам невозможно.