【问题标题】:How to detect data types from string?如何从字符串中检测数据类型?
【发布时间】:2015-04-06 15:52:37
【问题描述】:

有一个伪代码:

s = input()

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

我如何编写可以在没有任何if 的情况下执行此操作的代码。如下代码:

s = input()
func<s>(...) #auto detect type in s

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

【问题讨论】:

  • 你所问的实际上是不可能的。你可以encode什么类型不是类型本身,但计算机不是魔法。
  • 当然可以。通过使用工厂模式,他可以接受一个字符串,该字符串返回一个使用类模板共享的公共接口的对象。在这种情况下,它甚至可能不需要它,因为它似乎只调用一个函数,而实际的模板类型可以由工厂处理。
  • @swalog 但这并没有删除 if,它只是将它移到别处......
  • 当然@Alegnem,但我认为这仍然符合 OP 的精神。
  • @swalog 可能。带有字符串 -> 函数映射的映射也可以提供帮助。

标签: c++ type-conversion abstract-data-type custom-data-type


【解决方案1】:

虽然这不能直接使用模板函数实现,但我建议使用 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;
  }
}

另一种方法是使用std::map&lt;std::string, Function_Pointer_Type&gt;。地图必须在使用前进行初始化。静态常量表不需要在运行时初始化。

【讨论】:

  • 不知道你为什么要手动循环; coliru.stacked-crooked.com/a/e8183e4b7f6d79f0——或者,使用unordered_mapcoliru.stacked-crooked.com/a/95df7e4dcdee9adc
  • 我认为这不是一个好主意,如果我已经创建了 100000 个类型(在一些大项目中),如何构建这个表?
  • @dyp:因为我的公司还没有升级编译器以使用 C++11,而且我所有的 Visual Studio 编译器都是 C++03。这是一种习惯,对我来说,更具可读性。我看不出auto 有任何优势,除了打字而且我打字速度很快。
  • 而且很危险,在类型数量很大的情况下,不可能不出错地建这个表。
  • @TioPlato:对于 100000 种类型,您需要编写一个创建表的程序。或者你的设计有缺陷。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-02
  • 2015-02-07
  • 2021-03-04
  • 2011-08-29
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
相关资源
最近更新 更多