【发布时间】:2020-01-30 06:30:52
【问题描述】:
我正在尝试学习如何使用 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
struct CustomOutput {
// Constructor etc...
CustomOutput(std::ostream &os = std::cout) : os{os} {}
std::ostream &os;
// Problematic template function
template <class O, class = std::enable_if_t<is_ostreamable<O>::value>>
CustomOutput &operator<<(O o) {
os << o;
return *this;
}
};
最好不要启用无法通过operator<< 打印的struct 或class 模板。
但是,使用此 SFINAE,ostream 操纵器无法正常工作……而且我不知道为什么。
错误和我的期望:
int main(void){
CustomOutput{} << "hi"; // Fine
std::vector<int> vec;
// CustomOutput{} << vec; // Error. Expected
CustomOutput{} << std::endl; // Error. WHY?
}
也许我错过了什么?任何帮助将不胜感激。
【问题讨论】:
-
请提供完整的工作示例。您的
CustomOutput课程目前缺少某些部分 -
@NutCracker 抱歉。我添加了构造函数和成员。
标签: c++ templates c++17 sfinae