提问人:sancho.s ReinstateMonicaCellio 提问时间:10/20/2023 最后编辑:sancho.s ReinstateMonicaCellio 更新时间:10/20/2023 访问量:53
从运算符重载中排除多种类型<<
Exclude several types from an overload of operator<<
问:
这是运算符泛C++重载的后续<<因为 STL 容器对字符串产生模棱两可的重载错误 答案很好用。
但是在进一步测试后,我发现至少有一个类已经有了它,并且也与我的重载相匹配,.operator<<
setfill
我的MCVE发布在下面。
行 #1(见注释)产生编译错误。ambiguous overload for 'operator<<' (operand types are 'std::ostringstream' {aka 'std::__cxx11::basic_ostringstream<char>'} and 'std::_Setfill<char>')
有没有办法添加多个类以排除在?
我的情况的具体语法是什么,以及不断添加排除项的通用语法是什么?std::enable_if_t<not (std::is_same_v<std::string, Container<T...>>), ...
#include <iostream>
#include <vector>
#include <set>
#include <list>
#include <map>
#include <tuple>
#include <string>
#include <cstring>
#include <sstream>
#include <iomanip>
template<typename T, typename... Ts>
struct contains : std::bool_constant<(std::is_same<T, Ts>{} || ...)>
{};
template <template <class... K> class Container, class ...T>
std::enable_if_t<not (std::is_same_v<std::string, Container<T...>>),
std::ostream&> operator<<(std::ostream& os, const Container<T...>& c)
{
os << "[";
size_t nvals = 0;
for ( auto iter = c.begin() ; iter != c.end() ; iter++ ) {
os << *iter;
nvals++;
if (iter != --(c.end()))
os << ", ";
if (nvals > MAX_PRINT_VALS) {
os << "... (total of " << c.size() << " values)";
break;
}
}
os << "]";
return os;
}
using namespace std;
int main(int argc, char **argv) {
//============================================================
// Print iomanip flags
ostringstream msg;
int dT = 65205;
msg << std::setfill('0') // <--- Error Line #1
<< std::setw(2)
<< dT / 86400
<< "d";
cout << "Elapsed time = " << msg << endl;
return 0;
}
已实现
答: 暂无答案
评论