Рассмотрим следующую перегруженную функцию, которая может печатать 1d-вектор и вектор-вектор нескольких типов, таких как strings, ints, doubles et c.
template<typename T>
void p(const vector<vector<T>>& vec) {
int count = 0;
for (vector<T> innerVec: vec) {
cout << count++ << ": ";
for (T e :innerVec) {
cout << e << ' ';
}
cout << '\n';
}
cout << '\n';
}
template<typename T>
void p(const vector<T>& vec) {
for (T e: vec) {
cout << e << ' ';
}
cout << '\n';
}
Можно ли как-нибудь объединить эти две функции в 1? Я пытался использовать SFINAE и диспетчеризацию тегов, но все решения, которые я мог придумать, нуждаются в макросе или нескольких функциях, и я не хочу этого.
Я знаю, что вопрос может показаться странным, поскольку мое решение работает, но я предпочитаю иметь только одну функцию в моем коде. Это потому, что я хочу реализовать функцию, которая может обнаруживать, передаю ли я карту, вектор, вектор векторов, unordered_set, multimap и т. Д. c, и просто печатать эту структуру данных STL и иметь одну перегруженную функцию для каждой специализации: немного раздражает, поскольку это становится большим быстро.