简单数据类型中的模板类型推导[重复]
Posted
技术标签:
【中文标题】简单数据类型中的模板类型推导[重复]【英文标题】:Template type deduction in a simple datatype [duplicate] 【发布时间】:2019-03-22 09:41:34 【问题描述】:我正在尝试创建一个支持整数和浮点数的数据类型,并将在构造过程中推断出类型。
下面的代码可以编译,但我想修改它,以便编译 3 条注释行。
这在 C++98 中可行吗?
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class Result
public:
Result(std::string name, T value) : m_name(name), m_value(value)
private:
std::string m_name;
T m_value;
;
int main()
Result<double> hello(std::string("Test"), 123.45);
//std::vector<Result> results;
//results.push_back(Result("Test Int", 32));
//results.push_back(Result("Test Double", 42.1));
return 0;
编辑:
我只是希望能够将结果存储在向量中,结果类型将具有名称和值。该值可以是 int 或 float。除此之外,我并不关心类是如何定义的或它是如何实例化的。
【问题讨论】:
我认为你放错了括号...results.push_back(Result("Test Int"), 32);
应该是results.push_back(Result("Test Int", 32));
。下一行也是。
std::vector<Result> results;
即使在 C++20 中仍然无效
你没有传递模板参数来导致 std::vectorResult
in std::vector<Result> results;
的模板参数?那是不可能的。
【参考方案1】:
这在 C++98 中是不可能的,因为那里不支持 template argument deduction。
从现在开始考虑 C++17:
同样在这里,编译器无法推断出std::vector<Result> results;
中Result
的模板参数。那样是不可能的。想象一下这条线 - 如果没有任何价值来推断它,你怎么可能推断出任何类型?
但是,如果您知道要在向量中插入哪些元素(或至少是第一个元素),则可以让编译器通过调用以下命令来推断所有参数:
std::vector results Result("Test Int", 32) ;
请注意,在您的示例中,第二次插入具有 double
类型(与上面的 int
相比),因此您无法将其推入向量中。
如果您需要存储不同的类型,请查看 std::variant
或 std::any
(但这是另一回事)。
【讨论】:
【参考方案2】:编辑后,我认为最简单的方法是存储指针而不是实例。你不能创建指向模板类的指针,但你可以创建一个接口在向量中使用它:
class IResult ...;
然后 Result 必须继承自它。
template <typename T>
class Result : public IResult
...
最后,向量将使用 IResult 而不是 Result 指针来声明。
std::vector<IResult*> results;
results.push_back(new Result<int>("Test Int", 32));
results.push_back(new Result<double>("Test Double", 42.1));
请记住,您必须自己释放该内存。
【讨论】:
我希望避免指定Result
不是类型而是类模板。你不能形成指向类模板的指针。
我将编辑我的答案以避免模板类指针。谢谢!以上是关于简单数据类型中的模板类型推导[重复]的主要内容,如果未能解决你的问题,请参考以下文章