c++17 如何使用非类型模板创建模板实例

c++17 how to create a template instance with a non-type template

我想创建一个具有不同部分的主体,如果我知道该部分的名称,我可以使用 factory.Just 创建相应的实例,如下所示:

template<typename Part>
class Body
{};

class Part1
{};

class Part2
{};

enum class E
{
    part1,
    part2,
};

template<E e>
class Factory
{
public:
    static unique_ptr<Body<>> create()
    {
        if (e == E::part1)
        {
            return make_unique<Body<Part1>>();
        }
        else
        {
            return make_unique<Body<Part2>>();
        }
    }   
};

int main()
{
    auto f=Factory<E::part1>();
    return 0;
}

肯定是在编译时失败了,那我怎么弄到我的海豚呢?

此处没有包含 non-type 模板参数的任何内容,因此您的标题令人困惑。

我假设你抱怨的是编译器错误

Body<>

嗯,这是一个错误。 Body 不是类型,而是模板。它需要一个参数并且没有默认值。

代码希望它是一个 Body<Part1> 一个 Body<Part2> 但没有任何东西的 "Body “正如你暗示的那样。

您可以使用 variant 来拥有包含任一类型的类型。例如,

using BodyPart = std::variant<Body<Part1>,Body<Part2>>;

但您必须学习如何使用该值(最好是对访问者),因为它既不同于多态类型,也不同于泛型(编译时)模板。