【发布时间】:2018-08-12 20:51:19
【问题描述】:
我有一个变量x。
它可以是char、uint8_t 或std::string 类型。
我希望输出数字(不是字符),使用涉及std::cout的相同表达式。这是因为我在生成的代码中使用了这个表达式。
在代码生成时,我目前不知道x 是char、uint8_t 还是std::string。
如果x 的类型为char,则std::cout << x << std::endl 不起作用,因为它将输出字符而不是数字。
如果x 的类型为std::string,则std::cout << +x << std::endl 不起作用。
如果x 的类型为std::string,std::cout << (typeid(x) == typeid(uint8_t) || typeid(x) == typeid(char) ? +x : x) << std::endl 将不起作用。
如果x 的类型为std::string,则std::cout << (typeid(x) == typeid(uint8_t) || typeid(x) == typeid(char) ? static_cast<int>(x) : x) << std::endl 不起作用。
我知道std::cout 可以通过管道std::hex 或std::boolalpha 以各种方式配置,但我知道没有可能的方式配置std::cout 以输出char 作为数字,而不进行转换char 优先。
有没有办法使用反射、运算符重载、模板或其他东西
这样就可以有一个统一的语句来输出x,作为一个数字?
例如,如果 x 为 65,类型为 char,则所需的输出是 65,而不是 A。
【问题讨论】:
-
如果你有一个变量,你就知道它的类型。它怎么可能是三种类型中的一种,而不是它声明时使用的一种类型?我建议您显示minimal reproducible example 来说明问题。
-
我在编译时知道类型,但在代码生成时不知道。
-
请说明区别。并向我们展示您的代码
-
代码生成不能生成适当的输出语句,因为它知道类型吗?无论如何,您可以定义一个函数,例如
printMe,并带有int和string的重载,只返回参数。让生成器发出cout << printMe(x) -
我写了一个实验性的 Go to C++17 转译器。 github.com/xyproto/go2cpp/tree/so 在根目录下运行
go test时,这是错误:error: no match for ‘operator+’ (operand type is ‘std::__cxx11::string’ {aka ‘std::__cxx11::basic_string<char>’})。编译器当前在生成std::cout语句时不知道类型。在许多情况下,Go 和 C++17 是相似的,但在这种情况下并非如此。