LINUX.ORG.RU

История изменений

Исправление fsb4000, (текущая версия) :

Ещё можно унифицировать, чтобы поддерживались и с помощью концептов и с помощью функций.

#if __cpp_concepts >= 201907L
template<typename T>
concept has_toString = requires(const T& t) {
        t.toString();
    };
#else // ^^ concepts / vv no concepts
template<typename T, typename=decltype(std::declval<T>().toString())>
constexpr bool has_toString_fun(T*)
{
    return true;
}
constexpr bool has_toString_fun(...) {
    return false;
}
template<typename T>
inline constexpr bool has_toString = has_toString_fun((T*)nullptr);
#endif // __cpp_concepts >= 201907L

https://gcc.godbolt.org/z/sxG19Evcr

Тогда, в будущем можно будет удалить вариант без концептов, без изменения кода который это использует…

Исправление fsb4000, :

Ещё можно унифицировать, чтобы поддерживались и с помощью концептов и с помощью функций.

#if __cpp_concepts >= 201907L
template<typename T>
concept has_toString = requires(const T& t) {
        t.toString();
    };
#else // ^^ concepts / vv no concepts
template<typename T, typename=decltype(std::declval<T>().toString())>
constexpr bool has_toString_fun(T*)
{
    return true;
}
constexpr bool has_toString_fun(...) {
    return false;
}
template<typename T>
constexpr bool has_toString = has_toString_fun((T*)nullptr);
#endif // __cpp_concepts >= 201907L

https://gcc.godbolt.org/z/oerEoK5zz

Тогда, в будущем можно будет удалить вариант без концептов, без изменения кода который это использует…

Исходная версия fsb4000, :

Ещё можно унифицировать, чтобы поддерживались и с помощью концептов и с помощью функций.

#if __cpp_concepts >= 201907L
template<typename T>
concept has_toString = requires(const T& t) {
        t.toString();
    };
#else // ^^ concepts / vv no concepts
template<typename T, typename=decltype(std::declval<T>().toString())>
constexpr bool has_toString_fun(T*)
{
    return true;
}
constexpr bool has_toString_fun(...) {
    return false;
}
template<typename T>
constexpr bool has_toString = has_toString_fun((T*)nullptr);
#endif // __cpp_concepts >= 201907L

https://gcc.godbolt.org/z/oerEoK5zz

Тогда, в будущем можно будет удалить код вариант без концептов, без изменения кода который это использует…