可以打印矢量和矢量中的矢量的非重载C++函数
Non-overloaded C++ Function That Can Print a vector and a vector of vectors?
考虑以下重载函数,该函数可以打印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{});
}
实时查看
相关文章:
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 可以打印矢量和矢量中的矢量的非重载C++函数
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 使用模板重载函数
- C++线程中,没有重载函数接受 X 参数
- std::vector 没有重载函数的实例与参数列表匹配
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 错误:无法解析对重载函数的引用;你的意思是调用它吗?
- 对重载函数find_first_not_of的不明确调用
- 如何从重载解析中删除重载函数?
- CUDA:重载函数"isnan"的多个实例
- C++派生类重载函数(带有 std::function 参数)不可见
- 避免在人为的重载函数调用中拼写出类型
- C++:如何为多个重载函数保留通用代码路径?
- 什么时候可以使用常量装饰调用我的重载函数?
- 尝试使用谓词函数会导致错误:"std::sort"未找到匹配的重载函数
- std::调用,未找到匹配的重载函数
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- 为什么使用不匹配的参数调用重载函数仍然有效
- 如何通过签名作为模板参数来解决重载函数?