更改模板参数中 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;
}