更改模板参数中 bool 值的类型
Change type on bool value in template argument
我正在逐步学习模板,我认为这是我当前项目需要做的最后一件事:
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),因此欢迎概念。
您可以使用 std::conditional
template in #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;
}
我正在逐步学习模板,我认为这是我当前项目需要做的最后一件事:
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),因此欢迎概念。
您可以使用 std::conditional
template in #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;
}