Изменить тип на значение bool в аргументе шаблона

Я изучаю шаблон шаг за шагом, и я думаю, что это последнее, что мне нужно сделать для моего текущего проекта:

template < typename Object, bool Shared>
class  Foo {

  private:
    struct SubFoo {

      //if Shared == true -> FooShared  foo;
      //if Shared == false -> FooBasic  foo;
      ???          foo;
      Object       data;
    };
};

Я знаю, что это не сработает так же легко, как MagicType foo; так что не беспокойтесь об изменении кода. У меня нет ограничений C++ (g++6.2, интересно, как получить g++7), поэтому приветствуются даже концепции.

1 ответ

Решение

Вы можете использовать std::conditionalшаблон в #include <type_traits>:

typename std::conditional<Shared, FooShared, FooBasic>::type foo;

Как отмечено в комментарии, C++14 включает в себя более простой в использовании вариант под названием std::conditional_t как псевдоним:

std::conditional_t<Shared, FooShared, FooBasic> foo;

Пример кода:

#include <iostream>
#include <type_traits>

struct FooShared
{
    FooShared() { std::cout << "FooShared\n"; }
};

struct FooBasic
{
    FooBasic() { std::cout << "FooBasic\n"; }
};

template <bool shared>
class foo
{
    //typename std::conditional<shared, FooShared, FooBasic>::type mytype;
    std::conditional_t<shared, FooShared, FooBasic> mytype;
};


int main(int argc, char* argv[])
{
    foo<true> a;
    foo<false> b;
}
Другие вопросы по тегам