gpt4 book ai didi

c++ - 调用非成员运算符重载

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:59:44 24 4
gpt4 key购买 nike

给定以下代码:

#include <iostream>
#include <functional>
#include <utility>

template<class O, class T, class = void>
constexpr bool ostreamable_with = false;

template<class O, class T> // If there's user-defined overloads
constexpr bool ostreamable_with<
O, T, std::void_t<decltype(operator<<(std::declval<O>(),
std::declval<T>()))>> = true;

struct jostream : std::reference_wrapper<std::ostream>
{
using reference_wrapper::reference_wrapper;
std::ostream& os() { return *this; }

template<class T>
jostream& operator<<(T const& v)
{
if constexpr(ostreamable_with<jostream&, T const&>)
// This enables user-defined conversion on `v` too
operator<<(*this, v); // #1
else
os() << v;

return *this;
}
};

namespace user {
struct C
{ int a; };

inline jostream& operator<<(jostream& os, C const& c)
{ return os << c.a; }
}

int main()
{
jostream jos(std::cout);
user::C u{1};
jos << std::cref(u);
}

在线#1 ,有一个编译器错误,因为 jostream有一个名为 operator<< 的函数成员,因此调用 #1 (jostream::operator<< 中的注释行,而不是代码的第一行)试图显式调用 jostream::operator<<有两个不存在的参数。

是否有任何技巧可以强制调用具有冲突名称的非成员函数? (除了调用进行实际调用的外部函数)。 ::operator<<调用显然不是这里的解决方案,因为重载可能在用户命名空间内,如示例所示。

(使用 gcc-7.2.0)

最佳答案

using std::operator<<;
operator<<(*this, v);

std*this 的关联命名空间无论如何,所以这不会在重载集中引入任何新内容。或者,定义命名空间范围 operator<<使用一些虚拟类型并将其拉入 using .

关于c++ - 调用非成员运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46985367/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com