Я знаю, что на этот вопрос уже есть ответы, но я думаю, что мое решение этой проблемы немного отличается и может кому-то помочь.
В следующем примере проверяется, содержит ли переданный тип c_str()
функциональный член:
template <typename, typename = void>
struct has_c_str : false_type {};
template <typename T>
struct has_c_str<T, void_t<decltype(&T::c_str)>> : std::is_same<char const*, decltype(declval<T>().c_str())>
{};
template <typename StringType,
typename std::enable_if<has_c_str<StringType>::value, StringType>::type* = nullptr>
bool setByString(StringType const& value) {
// use value.c_str()
}
В случае, если необходимо выполнить проверки, содержит ли переданный тип определенный элемент данных, можно использовать следующее:
template <typename, typename = void>
struct has_field : std::false_type {};
template <typename T>
struct has_field<T, std::void_t<decltype(T::field)>> : std::is_convertible<decltype(T::field), long>
{};
template <typename T,
typename std::enable_if<has_field<T>::value, T>::type* = nullptr>
void fun(T const& value) {
// use value.field ...
}
ОБНОВЛЕНИЕ C++20
C++20 представил ограничения и концепции, основные функции языка в этой версии C++.
Если мы хотим проверить, содержит ли параметр шаблона c_str
функцию-член, то следующее будет работать:
template<typename T>
concept HasCStr = requires(T t) { t.c_str(); };
template <HasCStr StringType>
void setByString(StringType const& value) {
// use value.c_str()
}
Кроме того, если мы хотим проверить, существует ли элемент данных, который можно преобразовать в long
, можно использовать следующее:
template<typename T>
concept HasField = requires(T t) {
{ t.field } -> std::convertible_to<long>;
};
template <HasField T>
void fun(T const& value) {
// use value.field
}
Используя C++20, мы получаем гораздо более короткий и читаемый код, который ясно выражает его функциональность.
person
NutCracker
schedule
10.11.2019
enable_if
не используется для проверки существования члена, а используется для удаления перегрузок. - person Pubby   schedule 09.12.2012static if
, которого еще не существует. То, что вы хотите, вполне возможно, просто он не будет использовать такой синтаксис. - person Pubby   schedule 09.12.2012