gpt4 book ai didi

c++ - 如何使用可变参数模板在 C++ 中概括对象创建?

转载 作者:行者123 更新时间:2023-11-30 00:43:29 24 4
gpt4 key购买 nike

我正在尝试用 C++ 创建一个通用工厂方法,它可以创建许多(但数量有限)对象之一的实例。每个对象都需要不同类型的参数来构造,因此我希望该方法以某种方式推断出所需的类型,而不想让用户明确指定它。

下面是一些代码来说明我正在尝试做的事情:

#include <iostream>
using namespace std;

class A {
public:
A(int x, int y) {
cout << "A(" << x << ", " << y << ")\n";
}
};

class B {
public:
B(float a, float b) {
cout << "B(" << a << ", " << b << ")\n";
}
};

template<typename T, typename... Ts>
T * Make(Ts... vs) {
puts(__PRETTY_FUNCTION__); // __FUNCSIG__ or __PRETTY_FUNCTION__
return new T{ vs... };
}

现在,main 函数中的代码可以通过调用 Make< 创建 A *B * 类型的对象 像这样:

A *a = Make<A>(3, 4);
B *b = Make<B>(3.14f, 6.28f);

有没有一种方法可以扩展此代码,使其他函数能够调用 Make 而不必明确指定它们是想要 A * 还是 的实例B * ?例如,

A * a = Make(3, 4); // (int, int)
B * b = Make(3.14f, 6.28f); // (float, float)

我知道函数模板是使用参数类型推导来实例化的,返回类型不参与其中。但是,编译器不会进行任何类型转换。所以 Make(int, int) 绝对是与 Make(float, float) 不同的实例,我希望能够利用它来将函数定义映射到右边返回类型。

这是我尝试过的:

  • 定义显式实例化

    template A * Make(int x, int y);
  • 定义特化

    template<>
    A * Make<A, int, int>(int x, int y);

两者都没有按预期工作。关于如何实现这一目标的任何想法?

最佳答案

我写了一个 Maker 帮助器模板来注册哪些类是允许的,尽管我不完全知道如何禁用基本模板:

template <typename... Ts>
struct Maker {
using type = void;
};

template <>
struct Maker<int, int> {
using type = A;
};

template <>
struct Maker<float, float> {
using type = B;
};

template<typename... Ts, typename T=typename Maker<Ts...>::type>
T * Make(Ts... vs) {
puts(__PRETTY_FUNCTION__); // __FUNCSIG__ or __PRETTY_FUNCTION__
return new T{ vs... };
}

int main() {
A * a = Make(3, 4); // (int, int)
B * b = Make(3.14f, 6.28f); // (float, float)
}

关于c++ - 如何使用可变参数模板在 C++ 中概括对象创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54041600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com