C++ 如何从字符串中检测数据类型?

C++ 如何从字符串中检测数据类型?,c++,type-conversion,abstract-data-type,custom-data-type,C++,Type Conversion,Abstract Data Type,Custom Data Type,有一个伪代码: s = input() if s == 'int': func<int>(...) if s == 'char': func<char>(...) and there're more if blocks 我需要一个C++中的解决方案。 ,虽然这不是模板化函数直接可能的,但是我推荐一个查找表: STD::String 函数指针。 例如: typedef void (*Function_Pointer_Type)(void); stru

有一个伪代码:

s = input()

if s == 'int':
    func<int>(...)
if s == 'char':
    func<char>(...)
and there're more if blocks

我需要一个C++中的解决方案。

,虽然这不是模板化函数直接可能的,但是我推荐一个查找表:<代码> STD::String 函数指针。 例如:

typedef void (*Function_Pointer_Type)(void);  
struct Table_Entry
{
  char const * data_type_name;
  Function_Pointer_Type data_type_function;
};

void Process_Int(void);
void Process_Double(void);

static const Table_Entry data_type_function_table[] =
{
  {"int", Process_Int},
  {"double", Process_Double},
};
static const unsigned int number_of_data_types =
  sizeof(data_type_function_table) / sizeof(data_type_function_table[0]);

// ...
for (unsigned int i = 0; i < number_of_data_types; ++i)
{
  if (s == data_type_function_table[i].data_type_name)
  {
    data_type_function_table.data_type_function();
    break;
  }
}
typedef void(*函数指针类型)(void);
结构表\u项
{
字符常量*数据类型\名称;
函数\指针\类型数据\类型\函数;
};
作废处理(作废);
作废处理(作废);
静态常数表\输入数据\类型\函数\表[]=
{
{“int”,进程{u int},
{“double”,进程{u double},
};
数据类型的静态常量无符号整数=
sizeof(数据类型函数表)/sizeof(数据类型函数表[0]);
// ...
for(无符号整数i=0;i<数据类型的数量;++i)
{
if(s==数据类型函数表[i]。数据类型名称)
{
数据类型函数表。数据类型函数();
打破
}
}

另一种方法是使用
std::map
。必须先初始化映射,然后才能使用它。静态常量表不需要在运行时初始化

你问的不太可能。你可以把什么类型的东西编码到类型本身中,但计算机不是魔法。他当然可以。通过使用工厂模式,他可以接受一个字符串,该字符串返回一个使用类模板共享的公共接口的对象。在本例中,它甚至可能不需要这样做,因为它似乎只调用一个函数,而实际的模板类型可以由工厂处理。@swalog但这并没有删除if,它只是将它移到别处……if当然是@Alegnem,但我认为这仍然是OP所想的精神。@swalog可能。另外,一个带有字符串->函数映射的映射也会有所帮助。不知道为什么要用手动循环;——或者,使用一个无序的映射,我认为这不是一个好主意,如果我已经创建了100000个类型(在某个大项目中),如何构建这个表?@dyp:因为我的公司没有升级编译器以使用C++11,我所有的Visual Studio编译器都是C++03。这是一种习惯,对我来说更具可读性。除了打字之外,我看不出
auto
有什么好处,而且我打字很快。而且很危险,当类型的数量很大时,不可能毫无错误地构建这个表。@TioPlato:对于100000个类型,您需要编写一个程序来创建这个表。或者闻起来你的设计有缺陷。
typedef void (*Function_Pointer_Type)(void);  
struct Table_Entry
{
  char const * data_type_name;
  Function_Pointer_Type data_type_function;
};

void Process_Int(void);
void Process_Double(void);

static const Table_Entry data_type_function_table[] =
{
  {"int", Process_Int},
  {"double", Process_Double},
};
static const unsigned int number_of_data_types =
  sizeof(data_type_function_table) / sizeof(data_type_function_table[0]);

// ...
for (unsigned int i = 0; i < number_of_data_types; ++i)
{
  if (s == data_type_function_table[i].data_type_name)
  {
    data_type_function_table.data_type_function();
    break;
  }
}