从运算符重载中排除多种类型<<

Exclude several types from an overload of operator<<

提问人:sancho.s ReinstateMonicaCellio 提问时间:10/20/2023 最后编辑:sancho.s ReinstateMonicaCellio 更新时间:10/20/2023 访问量:53

问:

这是运算符泛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;
}

已实现

  1. 缩小 C++ 概念范围以排除某些类型
C++ C++17 运算符重载 不明确

评论


答: 暂无答案