Объявление участника или нет в зависимости от параметра шаблона
Можно ли объявить или нет переменную-член в зависимости от условия шаблона без использования пустого типа?
Пример:
struct empty{};
struct real_type{};
template<bool condition>
struct foo
{
typename std::conditional<condition, real_type, empty>::type _member;
};
Ответы
Ответ 1
Вы можете получить шаблон, имеющий специализацию:
struct real_type { };
template<bool c>
struct foo_base { };
template<>
struct foo_base<true>
{
real_type _member;
};
template<bool condition>
struct foo : foo_base<condition>
{
};
В качестве небольшого теста:
int main()
{
foo<true> t;
t._member.x = 42; // OK
foo<false> f;
f._member.x = 42; // ERROR! No _member exists
}
Ответ 2
Можно ли объявить или нет переменную-член в зависимости от условия шаблона без использования пустого типа?
Я считаю, что вы также можете specialize без вывода. Это проверили ОК как при -std=c++03
, так и -std=c++11
.
template<bool condition>
struct foo;
template<>
struct foo<true>
{
real_type _member;
};
template<>
struct foo<false>
{
};
Конечно, было бы неплохо, если бы комитет С++ дал нам то, что мы хотели/нуждались:
template<bool condition>
struct foo
{
#if (condition == true)
real_type _member;
#endif
};