В настоящее время я пытаюсь реализовать функцию toString
, которая вызывает .toString()
или std::to_string()
в зависимости от того, что доступно для выведенного типа.
Пока у меня есть этот рабочий фрагмент:
#include <iostream>
#include <string>
template <class T>
auto toString(const T& obj)
-> decltype(obj.toString(), std::string())
{
return obj.toString();
}
template <class T>
auto toString(const T& obj)
-> decltype(std::to_string(obj), std::string())
{
return std::to_string(obj);
}
template <class T>
auto toString(const T& obj)
-> decltype(std::string(obj))
{
return std::string(obj);
}
class Foo{
public:
std::string toString() const {
return "Hello";
}
};
int main()
{
Foo bar;
std::cout << toString(bar);
std::cout << toString(5);
std::cout << toString("Hello const char*");
}
Теперь я хочу вставить static_assert
, когда никакая перегрузка из приведенных выше не является жизнеспособной, потому что сообщение об ошибке GCC по умолчанию для более старых версий GCC не очень информативно.
Как я могу проверить, не возможны ли ни .toString()
, ни std::to_string()
для T
?
До сих пор я не нашел способа проверить, отсутствует что-то, только наоборот. Я надеюсь, что у кого-то есть идея, как решить эту проблему, и спасибо за ваше время.
decltype(std::to_string(obj), std::string())
- ТИЛ. Но вы должныvoid
первое выражение. Перегруженный оператор запятой от непослушного пользователя может испортить ваш SFINAE - person StoryTeller - Unslander Monica   schedule 08.10.2017std::string
, при этом фиксируя возвращаемый тип функции. Довольно умно. - person StoryTeller - Unslander Monica   schedule 08.10.2017