可用作数据类型的变量。
Posted
技术标签:
【中文标题】可用作数据类型的变量。【英文标题】:Variables that can be used as data types. 【发布时间】:2017-05-30 06:28:42 【问题描述】:在 C++ 中有什么方法可以通过我可以将程序中的数据类型(如(int、char、std::string 等)存储在某种特定类型的变量中,然后使用该变量代替常规数据类型(例如:声明其他变量)?
例如:-
T = some-function("int")
now std::vector < T > is equivalent to std::vector <int> ?
【问题讨论】:
在运行时执行此操作需要reflection,而 C++ 没有。一旦源文件被编译成translation unit,大多数类型信息就消失了。为了在编译时使用 templates,任何good beginners book 都应该有帮助。 使用模板。如果您想要在编译时不知道的泛型类型,请使用std::variant
【参考方案1】:
您可以使用模板和decltype
。
基于您的 sn-p 的最小工作示例:
#include<vector>
template<typename T>
T some_function() return ;
int main()
// t has type int
auto t = some_function<int>();
// vec has type std::vector<int> now
std::vector<decltype(t)> vec;
【讨论】:
【参考方案2】:您可以使用 using
关键字对类型进行别名(给它们另一个名称):
using vi = std:: vector<int>; // I recommend against such short names
// ...
vi some_vector_with_integers;
当然,这纯粹是在编译时发生的。
在模板中包装这样的声明允许编译编程:
template<int N>
using X = std::conditional<(N > 42), int, double>:: type;
【讨论】:
【参考方案3】:C++ 是一种静态类型语言,这意味着在运行时几乎不存在类型。函数返回类型完全由参数类型(const char*
)定义,不能依赖于参数值("int"
)。
计算流程会受到类型的影响,例如通过重载 - 但反之亦然。因此,您无法通过调用某个函数来“计算”类型。
相反,您可以使用模板/decltype
/auto
在编译时生成复杂的和上下文相关的类型,或者使用多态类型。
多态类型确实具有运行时定义的行为:您可以让some-function
返回一个抽象工厂,然后使用该工厂来生成您的对象——它们的具体类型在编译时是未知的。当然,你仍然需要用一些静态类型来实例化vector
——通常是指向泛型类的指针(AbstractType*
)。
您提到int
、char
和std::string
的事实暗示您可能不想要整个多态层次结构并且可以使用静态类型进行管理。
Here 是一些模板,用于确定调用函数的结果类型。请注意,该函数甚至没有被调用 - 同样,返回类型仅取决于参数类型,而不是某些计算。
【讨论】:
以上是关于可用作数据类型的变量。的主要内容,如果未能解决你的问题,请参考以下文章