周末自干一个 variant
( 类似 http://www.boost.org/doc/libs/1_56_0/doc/html/variant.html )
我的 variant 宣告长这样
template <typename T0, typename ... Rest>
class variant { ... };
在帮这个 class variant 加上 std::cout << 的支援的时候遇到一个小问题
template <typename ... Ts>
std::ostream& operator<<(std::ostream& os, const variant<Ts...>& v) {
return v.apply([&os](const auto& m) -> decltype(auto) {
return os << m;
});
}
然后使用他
variant<int, double> v{3};
std::cout << v << std::endl; // 编译失败,找不到对应的 <<
candidate 当中有我写的那个 operator<< 版本,但 Ts... 被推导成 <>
也就是一个 type argument 都没有推导成功
神奇的是我改成
template <typename T0, typename T1>
std::ostream& operator<<(std::ostream& os, const variant<T0, T1>& v) {
return v.apply([&os](const auto& m) -> decltype(auto) {
return os << m;
});
}
就成功了,百思不得其解。
可是这种写法,只能用在固定个数的 type arguments。
后来想一想,该不会是 template args 的形式上也要对应吧 = =||
于是改成像 variant<T0, Rest...> 的形式试试看
template <typename T0, typename ... Rest>
std::ostream& operator<<(std::ostream& os, const variant<T0, Rest...>& v) {
return v.apply([&os](const auto& m) -> decltype(auto) {
return os << m;
});
}
竟然过了 = =||
虽然不知道原因,其实标准我也没很熟,但总之会动就好
分享一下,以免以后有人撞到一样的问题