Изменить тип на значение 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;
}