我可以为运算符模板运算符重载<<

时间:2017-04-09 17:34:36

标签: c++

我有这两个重载的运算符<<功能。我可以使用模板系统将这些功能压缩为1个功能吗?

std::ostream& operator<<(std::ostream& os, const std::vector<glm::vec3>& vertices){
  for (auto i = vertices.begin(); i != vertices.end(); ++i){
    os << glm::to_string(*i) << '\n';
  }

  return os;
}

std::ostream& operator<<(std::ostream& os, const std::vector<glm::ivec3>& vertices){
  for (auto i = vertices.begin(); i != vertices.end(); ++i){
    os << glm::to_string(*i) << '\n';
  }

  return os;
}

1 个答案:

答案 0 :(得分:2)

是的,您可以使用功能模板[5, 1, 4, 0, 6, 2, 3] ,以便拥有适用于std::enable_ifglm::vec3的单一功能:

glm::ivec3

live wandbox example

如果您想支持使用template <typename T> auto operator<<(std::ostream& os, const std::vector<T>& vertices) -> std::enable_if_t< std::is_same<T, glm::vec3>::value || std::is_same<T, glm::ivec3>::value, std::ostream&> { for (auto i = vertices.begin(); i != vertices.end(); ++i){ os << glm::to_string(*i) << '\n'; } return os; } 的每种类型,您可以使用表达式SFINAE

glm::to_string

live wandbox example