This question already has answers here:
C++ : Vector of template class
                                
                                    (4个答案)
                                
                        
                                9个月前关闭。
            
                    
我正在尝试创建一个支持整数和浮点数的数据类型,并在构造过程中推断出该类型。

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

最佳答案

由于在C ++ 98中不支持template argument deduction,因此这是不可能的。

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

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

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

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


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

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

关于c++ - 简单数据类型中的模板类型推导,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55296765/

10-15 00:26
查看更多