我正在尝试创建一个支持整数和浮点数的数据类型,并在构造过程中推断出该类型。
下面的代码可以编译,但是我想对其进行修改,以使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。除此之外,我并不真正在乎该类的定义或实例化方式。
答案 0 :(得分:2)
在C ++ 98中这是不可能的,因为那里不支持template argument deduction。
从现在开始考虑C ++ 17:
在这里,编译器也无法在Result
中推导std::vector<Result> results;
的模板参数。这样是不可能的。试想一下那条线-您怎么可能能够推断出没有任何价值的任何类型呢?
但是,如果您知道是否要提前将哪些元素插入向量(或至少是第一个元素),则可以让编译器通过调用以下内容来推导出所有参数:
std::vector results { Result("Test Int", 32) };
请注意,在您的示例中,第二个插入具有double
类型(与上面的int
相比),因此您将无法将其推入向量中。
如果需要存储其他类型,请查看std::variant
或std::any
(但这是另一回事)。
答案 1 :(得分:0)
编辑后,我认为最简单的方法是存储指针而不是实例。您不能创建指向模板类的指针,但可以创建一个接口以在向量中使用它:
Arguments: /c C:\Path\To\My\LowerBuildPriority.bat
然后Result必须从中继承。
class IResult {...};
最后,将使用IResult而不是Result指针声明向量。
template <typename T>
class Result : public IResult
{
...
请记住,您必须自己释放内存。