如何用 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,除非您明确提供该参数——因为该类型永远不会被推断为引用类型或具有限定符。