Я хочу сделать перегруженный оператор <<, который используется только контейнерами (массив / вектор). </p>
У меня есть следующий шаблон:
namespace reachability {
template <typename Container>
ostream& operator<<(ostream& out, const is_container<Container>(&container)) {
string result = "{";
for (values_t elem : container) {
result += std::string(elem) + ",";
}
std::operator<<(out, result.substr(0, result.length() - 1) + "}");
return out;
}
struct values_t {
string type;
operator std::string() const { return type; }
};
template<typename T, typename _ = void>
struct is_container : std::false_type {};
template<typename... Ts>
struct is_container_helper {};
template<typename T>
struct is_container<
T,
std::conditional_t<
false,
is_container_helper<
typename T::value_type,
typename T::size_type,
typename T::allocator_type,
typename T::iterator,
typename T::const_iterator,
decltype(std::declval<T>().size()),
decltype(std::declval<T>().begin()),
decltype(std::declval<T>().end()),
decltype(std::declval<T>().cbegin()),
decltype(std::declval<T>().cend())
>,
void
>
> : public std::true_type{};
}
И он используется в:
reachability::values_t vals[5];
int main(int argc, char** argv)
{
vals[0].type = "zoo";
vals[1].type = "foo";
vals[2].type = "loo";
vals[3].type = "koo";
vals[4].type = "moo";
/*elements_t elems = { space::half };*/
reachability::operator<<(cout, vals);
return 0;
}
Однако я получаю сообщение об ошибке, что ни один экземпляр перегруженного оператора не соответствует списку аргументов.
У меня та же проблема, если я изменяю шаблон оператора на:
ostream& operator<<(ostream& out, const Container (&container)[])
Мне удалось заставить его работать, выполнив:
ostream& operator<<(ostream& out, const Container (&container))