【问题标题】: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&lt;Result&gt; results; 即使在 C++20 中仍然无效
  • 你没有传递模板参数来导致 std::vector
  • @LuisGP 谢谢,我修好了
  • 编译器如何能够推断出Resultin std::vector&lt;Result&gt; results; 的模板参数?那是不可能的。

标签: c++ templates


【解决方案1】:

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

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

同样在这里,编译器无法推断出std::vector&lt;Result&gt; results;Result 的模板参数。那样是不可能的。想象一下这条线 - 如果没有任何价值来推断它,你怎么可能推断出任何类型?

但是,如果您知道要在向量中插入哪些元素(或至少是第一个元素),则可以让编译器通过调用以下命令来推断所有参数:

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

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

如果您需要存储不同的类型,请查看 std::variantstd::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));
    

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

    【讨论】:

    • 我希望避免指定 ,但这与我想要的非常接近。谢谢!
    • std::vector 结果;将导致编译错误,提示“模板参数 1 无效”
    • Result 不是类型而是类模板。你不能形成指向类模板的指针。
    • 我将编辑我的答案以避免模板类指针。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多