Я новичок в концепции С++ 20, но из примеров, которые я видел, этот код должен работать...
#include <iostream>
#include <string>
#include <concepts>
#include <memory>
using namespace std;
struct hasToString
{
string toString()
{
return __FUNCTION__;
}
};
struct noToString
{
};
template<typename T>
concept has_toString = requires(const T & t)
{
t.toString();
};
template<typename T>
string optionalToString(const T &obj)
{
if constexpr (has_toString<T>)
return obj.toString();
else
return "toString not defined";
}
int main()
{
hasToString has;
unique_ptr<noToString> hasnt = make_unique<noToString>();
cout << optionalToString(has) << '\n';
cout << optionalToString(hasnt) << '\n';
}
Ожидаемый результат:
hasToString::toString
toString не определен
но вместо этого я получаю:
toString не определен
toString не определен
Что я делаю не так в таком простом примере? Я выбрал std:c++latest в качестве стандарта языка C++.