如何用 std::is_same_v 匹配所有字符串类型
How to match all string types with std::is_same_v
我正在尝试使用模板来生成方法。但是,我正在努力匹配字符串类型,如字符串 char *
文字。请参阅以下代码示例:
template<typename ValueType>
void match_data_type(ValueType value) {
if constexpr (std::is_same_v<std::remove_cvref_t<ValueType>, bool>) {
std::cout << "bool" << std::endl;
} else if constexpr (std::is_same_v<std::remove_cvref_t<ValueType>, char>) { // Useless?
std::cout << "char" << std::endl;
} else if constexpr (std::is_same_v<std::remove_cvref_t<ValueType>, char *>) {
std::cout << "char *" << std::endl;
} else if constexpr (std::is_same_v<std::remove_cvref_t<ValueType>, char[]>) { // Useless?
std::cout << "char[]" << std::endl;
} else if constexpr (std::is_same_v<std::remove_cvref_t<ValueType>, std::string>) {
std::cout << "std::string" << std::endl;
} else {
std::cout << "Not matched!" << std::endl;
}
}
测试用例:
match_data_type(false);
char *string_buffer = "Text";
match_data_type(string_buffer);
match_data_type("Test");
std::string standard_string = "Test";
match_data_type(standard_string);
输出:
bool
char *
Not matched!
std::string
让我感到惊讶的部分是 Not matched!
输出,因为我将字符串文字直接传递到方法中,但它与任何情况都不匹配。
1)是否有匹配所有类型char *
的constexpr
检查?然后我需要 std::string
对象的另一个案例,这样我就可以将 .c_str()
传递到相应的遗留方法中,该方法期望 char *
作为其参数。
2) 如果 none 个案例匹配,是否有办法使编译静态失败? (例如 else
分支被采用)。 else
分支中的 static_assert(false)
不起作用,因为它将始终生效,无论传递的参数类型如何。
字符串文字是常量。
"hello"
的类型是 char const[6]
,它会衰减(因为您按值取值)到 char const*
。你必须检查那个,而不是 char*
.
对于其余代码,char
检查并非无用(您当然可以调用 match_data_type('c')
)但 char[]
是——参数永远不会有数组类型,因为它是一个值。
更广泛地说,std::remove_cvref_t<ValueType>
将始终只是 ValueType
,除非您明确提供该参数——因为该类型永远不会被推断为引用类型或具有限定符。
我正在尝试使用模板来生成方法。但是,我正在努力匹配字符串类型,如字符串 char *
文字。请参阅以下代码示例:
template<typename ValueType>
void match_data_type(ValueType value) {
if constexpr (std::is_same_v<std::remove_cvref_t<ValueType>, bool>) {
std::cout << "bool" << std::endl;
} else if constexpr (std::is_same_v<std::remove_cvref_t<ValueType>, char>) { // Useless?
std::cout << "char" << std::endl;
} else if constexpr (std::is_same_v<std::remove_cvref_t<ValueType>, char *>) {
std::cout << "char *" << std::endl;
} else if constexpr (std::is_same_v<std::remove_cvref_t<ValueType>, char[]>) { // Useless?
std::cout << "char[]" << std::endl;
} else if constexpr (std::is_same_v<std::remove_cvref_t<ValueType>, std::string>) {
std::cout << "std::string" << std::endl;
} else {
std::cout << "Not matched!" << std::endl;
}
}
测试用例:
match_data_type(false);
char *string_buffer = "Text";
match_data_type(string_buffer);
match_data_type("Test");
std::string standard_string = "Test";
match_data_type(standard_string);
输出:
bool
char *
Not matched!
std::string
让我感到惊讶的部分是 Not matched!
输出,因为我将字符串文字直接传递到方法中,但它与任何情况都不匹配。
1)是否有匹配所有类型char *
的constexpr
检查?然后我需要 std::string
对象的另一个案例,这样我就可以将 .c_str()
传递到相应的遗留方法中,该方法期望 char *
作为其参数。
2) 如果 none 个案例匹配,是否有办法使编译静态失败? (例如 else
分支被采用)。 else
分支中的 static_assert(false)
不起作用,因为它将始终生效,无论传递的参数类型如何。
字符串文字是常量。
"hello"
的类型是 char const[6]
,它会衰减(因为您按值取值)到 char const*
。你必须检查那个,而不是 char*
.
对于其余代码,char
检查并非无用(您当然可以调用 match_data_type('c')
)但 char[]
是——参数永远不会有数组类型,因为它是一个值。
更广泛地说,std::remove_cvref_t<ValueType>
将始终只是 ValueType
,除非您明确提供该参数——因为该类型永远不会被推断为引用类型或具有限定符。