可用作数据类型的变量。

时间:2017-05-30 06:28:42

标签: c++ c++11 c++14

在C ++中是否有任何方法可以将数据类型存储在程序中,如(int,char,std :: string等)在某种特定类型的变量中,然后使用该变量代替常规数据类型(例如:声明其他变量)?

例如: -

T = some-function("int")
now std::vector < T > is equivalent to std::vector <int> ? 

3 个答案:

答案 0 :(得分:4)

您可以使用模板和decltype 基于您的代码段的最小的工作示例:

#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;
}

答案 1 :(得分:0)

您可以使用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;

答案 2 :(得分:0)

C ++是一种静态类型语言,这意味着运行时中几乎不存在类型。函数返回类型完全由参数类型(const char*)定义,不能依赖于参数值("int")。

计算流程可能会受到类型的影响,例如:通过过载 - 但反之亦然。因此,您无法通过调用某个函数来“计算”类型。

相反,您可以使用模板/ decltype / auto在编译时生成复杂和依赖于上下文的类型,或使用多态类型。

多态类型确实具有运行时定义的行为:您可以使some-function返回抽象工厂,然后使用该工厂生成对象 - 它们的具体类型在编译时是未知的。当然,您仍然需要使用某种静态类型实例化vector - 通常是指向泛型类(AbstractType*)的指针。

您提到intcharstd::string这一事实暗示您可能不需要整个多态层次结构,并且可以使用静态类型进行管理。

Here是一些模板,用于确定调用函数的结果类型。请注意,甚至没有调用该函数 - 再次,返回类型仅取决于参数类型,而不是某些计算。