I'm trying to use templates to generify a method. However I'm struggling to match string types like string char * literals. See the following code example:
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;
}
}
Test cases:
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);
Output:
bool
char *
Not matched!
std::string
The surprising part to me is the Not matched! output since I passed a string literal directly into the method and it didn't match any of the cases.
1)Is there any constexpr check which matches all types of char *? Then I need another case for std::string objects so I can pass the .c_str() into the respective legacy method which expects char * as its argument.
2) Is there a way to statically fail the compilation if none of the cases are matched? (e.g. the else branch is taken). static_assert(false) in the else branch does not work since it will always take effect, regardless of the passed parameter type.