在模板参数中更改bool值的类型

Change type on bool value in template argument

本文关键字:bool 类型 参数      更新时间:2023-10-16

我正在逐步学习模板,我认为这是我当前项目需要做的最后一件事:

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),因此欢迎概念。

您可以在#include <type_traits>中使用std::conditional模板:

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 << "FooSharedn"; }
};
struct FooBasic
{
    FooBasic() { std::cout << "FooBasicn"; }
};
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;
}