C++ 如何识别变量的类型

4

如果有一个变量来自于一个向量,有没有一种方法可以确定它的类型。

请注意,我已经知道成员的类型,并且可以在调用模板时指定它。这是一个特定的向量,允许将特定类型的变量推入(push_back())。

例如,我们有一个允许向量操作的类。

auto data = member().back(); // gets the last entry in the member vector

使用模板,我希望创建一个新的类型条目。
dataType newdata;
member().push_back(newdata)

在执行back()操作后,有没有一种方法可以确定dataType是什么?如果有,我可以创建一个模板,并通过传递成员指示器来检索类型。

如果没有,我将不得不明确传递类型以进行定义。

::base::dataArea newdata;
2个回答

6
你可以使用 typename std::remove_reference<decltype( member().back() )>::type 如果你确实想要聪明一点。但是相反,你应该使用 typename V::value_type,其中 V 是通过 member 访问的向量的类型。例如,请参阅 cppreference 上的文档:查阅相关文档通常是个好主意。

显然,std::remove_reference<decltype(member.back())::type> 是正确的解决方案 :) - lcs
@0x499602D2:谢谢,已修复。 - Cheers and hth. - Alf
我不需要获取成员的类型,而是想获取存储在Member向量中的类型,以便可以创建一个新条目并将其push_back到向量中。我会尝试澄清这个问题。 - sabbahillel
@sabbahillel:这个问题没问题。 - Cheers and hth. - Alf
谢谢,然而,阅读文档页面后,我不确定如何使用它来引用类型。我该如何使用创建的类型? - sabbahillel
只需声明新类型即可。例如,如果memberstd::vector<int>类型,则以下内容将是有效的:std::remove_reference<decltype(member.back())>::type newInt = 5;newInt的类型为int - lcs

1
简单解决方案:member().resize(member().size()+1)
通常情况下,你无法对未知数据类型进行推理,因此你可以做的很少。例如,你不能盲目地假设它们有一个名为.foo()的成员。你可能会合理地假设该类型具有默认、复制和/或移动构造函数,然后通常你也不需要明确指定类型——就像.resize()调用中所示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接