简单数据类型中的模板类型推导

时间:2019-03-22 09:41:35

标签: c++ templates

我正在尝试创建一个支持整数和浮点数的数据类型,并在构造过程中推断出该类型。

下面的代码可以编译,但是我想对其进行修改,以使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。除此之外,我并不真正在乎该类的定义或实例化方式。

2 个答案:

答案 0 :(得分:2)

在C ++ 98中这是不可能的,因为那里不支持template argument deduction

从现在开始考虑C ++ 17:

在这里,编译器也无法在Result中推导std::vector<Result> results;的模板参数。这样是不可能的。试想一下那条线-您怎么可能能够推断出没有任何价值的任何类型呢?

但是,如果您知道是否要提前将哪些元素插入向量(或至少是第一个元素),则可以让编译器通过调用以下内容来推导出所有参数:

std::vector results { Result("Test Int", 32) };

请注意,在您的示例中,第二个插入具有double类型(与上面的int相比),因此您将无法将其推入向量中。

如果需要存储其他类型,请查看std::variantstd::any(但这是另一回事)。

答案 1 :(得分:0)

编辑后,我认为最简单的方法是存储指针而不是实例。您不能创建指向模板类的指针,但可以创建一个接口以在向量中使用它:

Arguments: /c C:\Path\To\My\LowerBuildPriority.bat

然后Result必须从中继承。

class IResult {...};

最后,将使用IResult而不是Result指针声明向量。

template <typename T>
class Result : public IResult
{
...

请记住,您必须自己释放内存。