使用标准类型的动态类型信息实例化标识符

Instantiating identifier with dynamic type info on standard types

本文关键字:类型 信息 实例化 标识符 动态 标准      更新时间:2023-10-16

我知道有更简单的方法可以做到这一点,但这就是我要问的。

假设您有一个模板函数 function1 和另一个模板函数 function2。

函数定义如下:

template <typename A>
void function1(A x) // typename A is part of a class-template function
                    // the typename is declared in the class instantiation
                    // and passed to function2
template <typename B>
void function2(B y) // I know I can use typeinfo(y).name to get name
                    // this returns a const char* 'm' 
                    // 'm' stands for unsigned long on my sytem

"m"断言的参考在这里:std::typeid::name() 的奇怪输出

正如我所说,我知道有可能找出(推断)函数接收的参数

const char* x = typeinfo(parameter).name;
// returns const char* 'm' on my machine

如果函数收到泛型参数,是否可以也实例化相同类型的新对象。像这样:

<x> foo;
// where x represents the const char* = 'm'
// which in turn is represented by unsigned long on my system
// so foo would be an uninstantiated unsigned long identifier

我在这里看到:从动态类型信息创建一个新对象,对象是不可能的,但我想知道像 int 这样的内部类型是否可以。

谢谢!

为此使用模板?

template <typename T> 
void foo(T yourParam)
{
    T newVar;  //Use of the deduced type to declare new variable
}

您还可以使用decltype

decltype(parameter) newVar;

既然你似乎坚持使用const char *,并且你问的是内置类型,为什么不使用switch语句呢?

switch(x)
{
    case 'm' : {
        unsigned long foo;
        //functionality
        break;
    }
    //other cases
    default : break;
}

您可以使用 decltype 从任何表达式中提取类型,例如使用它来声明另一个变量:

decltype(1 + 3.14159) e;
e = 2.7182818;

但这适用于编译时类型信息("静态"类型)。 没有办法基于动态类型来做到这一点,也没有办法使用运行时类型数据(typeid返回的typeinfo,或者你可以在运行时捕获的任何其他对象)。 充其量,您可以获取类型名称,写出一个C++源文件,并在其上调用C++编译器。