简单数据类型中的模板类型推导[重复]

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&lt;Result&gt; results; 即使在 C++20 中仍然无效 你没有传递模板参数来导致 std::vector @LuisGP 谢谢,我修好了 编译器如何能够推断出Resultin std::vector&lt;Result&gt; results; 的模板参数?那是不可能的。 【参考方案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 不是类型而是类模板。你不能形成指向类模板的指针。 我将编辑我的答案以避免模板类指针。谢谢!

以上是关于简单数据类型中的模板类型推导[重复]的主要内容,如果未能解决你的问题,请参考以下文章

什么是模板推导中的部分排序程序

Python中的类型推导[重复]

模板之类模板

模板别名、变量模板和自动类型推导无法推导模板参数

模板中右值的类型推导

c++11模板类型推导规则