Я изучаю концепции C++20 и мне нужна помощь. Я хотел бы напечатать сообщение на стандартный вывод, когда предложение «требуется» концепции не выполнено. Концепция, как и ожидалось, не компилируется, когда класс BadObject не имеет метода печати, но я хотел бы предоставить альтернативный шаблон, когда «требования» не удовлетворены, и в случае BadObject он должен напечатать «объект не имеет метода печати». " сообщение. Может быть, это почти все равно, что отрицать пункт «требования» концепции? Есть ли способ добиться этого? Спасибо!
#include <iostream>
template <typename T>
concept HasPrintMethod =
requires(T t) { { t.Print() } ;
};
struct GoodObject {
void Print() {
std::cout << "hello from the object!\n";
}
};
struct BadObject {};
template<typename T>
void PrintValue(T obj) {
if (HasPrintMethod<T>) {
obj.Print();
} else {
std::cout << "object has no Print method!\n";
}
}
int main(){
PrintValue(GoodObject());
// compile-time error as expected, how do I print "object has no Print method" to
//stdout
PrintValue(BadObject());
}
if constexpr
— это недостающая часть вашей собственной попытки
template<typename T>
void PrintValue(T obj) {
if constexpr (HasPrintMethod<T>) {
obj.Print();
} else {
std::cout << "object has no Print method!\n";
}
}
Короче говоря: даже если условие исходит из концепции или другой константы времени компиляции, обычное if будет создавать экземпляры обеих ветвей. С другой стороны, constexpr if разрешено отбрасывать ветку, если параметр шаблона не удовлетворяет условию.
@bolov — это попытка обобщить многие аспекты поведения: ветка должна появляться в шаблоне, быть зависимой, а не быть неправильной; NDR, а не символический суп и т. д. Это действительно лучший способ обо всем этом сказать.
Я понимаю. Это имеет смысл.