Объявление участника или нет в зависимости от параметра шаблона

Можно ли объявить или нет переменную-член в зависимости от условия шаблона без использования пустого типа?

Пример:

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
};