可以打印矢量和矢量中的矢量的非重载C++函数

Non-overloaded C++ Function That Can Print a vector and a vector of vectors?

本文关键字:重载 函数 C++ 打印      更新时间:2023-10-16

考虑以下重载函数,该函数可以打印1d矢量和多种类型的矢量,如字符串、int、doubles等。

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和标记调度,但我能想到的所有解决方案都需要一个宏或多个函数,我不想要这样。

我知道这个问题可能看起来很奇怪,因为我的解决方案是有效的,但我更喜欢在代码中只有一个函数。这是因为我想实现一个函数,该函数可以检测我是否正在传递映射、向量、向量中的向量、无序集、多映射等,并且只打印STL数据结构,并且每个专门化都有一个重载函数,这有点烦人,因为它很快就会变大。

我今天回答了一个类似的问题。看看那里:https://stackoverflow.com/a/60298735/8192043

在此处粘贴解决方案:

这应该适用于您的案例。请注意,我使用的是@Jarod42在这个令人惊叹的解决方案中实现的特性https://stackoverflow.com/a/29634934/8192043.

template<template<typename ...> typename C, typename D, typename ... Others>
void foo(const C<D, Others...> &object)
{
if constexpr(is_iterable<D>::value)
{
for(const auto& v : object)
{
for (const auto& w : v)
{...}
}
}
else
{
for (const auto& w : object)
{...}
}
}

实时代码

是的,但您需要一个额外的参数来区分内部和外部

#include <vector>
#include <iostream>
struct counting_prefix {
void call() { std::cout << count++ << ": "; }
int count = 0;
};
struct no_prefix {
void call() { }
};
template<typename T, typename Prefix = no_prefix>
void p(const T& e, Prefix prefix = {}) {
prefix.call();
std::cout << e << ' ';
}
template<typename T, typename Prefix = no_prefix>
void p(const std::vector<T>& vec, Prefix prefix = {}) {
for (const T& e: vec) {
prefix.call();
p(e);
}
std::cout << 'n';
}
int main() {
std::vector<std::vector<double>> stuff = { { 1., 2. }, { 3., 4. } };
p(stuff, counting_prefix{});
}

实时查看