我正在尝试学习如何使用SFINAE。出于练习目的,我试图制作一个std::ostream
包装器以创建自定义格式程序。
这是我的SFINAE和自定义输出类。
// Tester
template <class O>
struct is_ostreamable {
template <class T>
static auto check(T t) -> decltype(std::declval<std::ostream &>() << t, std::true_type());
template <class>
static auto check(...) -> std::false_type;
public:
static constexpr bool value{std::is_same_v<decltype(check<O>(0)), std::true_type>};
};
// Custom class
class CustomOutput {
// Constructor etc...
template <class O, class = std::enable_if_t<is_ostreamable<O>::value>>
CustomOutput &operator<<(O o) {
os << o;
return *this;
}
}
完美地说,是不启用无法通过struct
打印的class
或operator<<
模板。但是,使用此SFINAE时,ostream机械手无法正常工作...而且我不知道为什么。
错误,和我的期望:
int main(void){
CustomOutput{} << "hi"; // Fine
std::vector<int> vec;
// CustomOutput{} << vec; // Error. Expected
CustomOutput{} << std::endl; // Error. WHY?
}
也许我错过了什么?任何帮助将不胜感激。