gpt4 book ai didi

c++ - 不使用 decltype 复制相同的行为

转载 作者:行者123 更新时间:2023-12-03 07:22:54 25 4
gpt4 key购买 nike

下面的代码可用于快速调试。它可以漂亮地打印容器,如来自 STL 的 vector ,同时还能够使用 SFINAE 技术为基本类型和可流式类型提供打印特性。
我想在不使用 decltype 的情况下复制相同的行为.对于我想到的一些项目,任何其他复制这种行为的巧妙技术在实现方面都非常有用。当前线程也可以认为是 this 的延续线程(也由我)。我设法通过 concepts 获得了一个整洁的工作实现在 C++20 (GCC 10.2.0) 中不使用 decltype但我希望能够在 C++17 (GCC 9.2.0) 和更低版本中做到这一点(显然,没有概念和前面提到的 decltype)。

namespace debugging {
template <typename T>
class range {
public:
T begin, end;
};

template <typename T>
auto make_range (const T& b, const T& e) -> range <T> {
return {b, e};
}

template <typename T>
auto is_streamable_object (T *x) -> decltype(std::cerr << *x, std::true_type());

template <typename T>
auto is_streamable_object (...) -> decltype(std::false_type());

class view {
private:
std::ostream& stream;
public:
view (std::ostream& os = std::cerr) : stream (os)
{ };

~view ()
{ stream << std::endl; };

#ifdef LOST_IN_SPACE
template <typename T>
std::enable_if_t <std::is_same <decltype(is_streamable_object <T> (nullptr)), std::true_type>::value, view&>
operator << (const T& t) {
stream << std::boolalpha << t; return *this;
}

template <typename T>
std::enable_if_t <std::is_same <decltype(is_streamable_object <T> (nullptr)), std::false_type>::value, view&>
operator << (const T& t) {
return *this << make_range(begin(t), end(t));
}

template <typename T>
view& operator << (const range <T>& r) {
stream << "[";
for (auto i = r.begin, j = i; i != r.end; ++i)
*this << *i << (++j == r.end ? "]" : ", ");
return *this;
}

template <typename A, typename B>
view& operator << (const std::pair <A, B>& p) {
stream << '(' << p.first << ", " << p.second << ')';
return *this;
}
#else
template <typename T> view& operator << (const T&)
{ return *this; }
#endif
};
} // namespace debugging
测试代码,以防您想自己快速尝试:
#define print(x) " [" << #x << ": " << x << "] "

using view = debugging::view;
view debug (std::cerr);

auto test () -> void {
std::vector <int> v {1,2,3,4,5};
std::map <int, int> m {{1,2}, {3,4}};
debug << print(v) print(m) << "\nHello World";
}

最佳答案

当然,这是使用 sizeof 的实现:

template<class T, class = std::false_type>
struct is_streamable_object : std::false_type {};

template<class T>
struct is_streamable_object<T,
std::bool_constant<sizeof(std::cerr << std::declval<T>()) == 0>> : std::true_type {};
Example .
您可以使用的其他关键字包括 alignof , noexcept , typeid , 和 explicit (自 C++20 以来的最后一个)。
本质上,您想要执行表达式 SFINAE,这需要构造一个不求值的表达式。 operators that allow constructing unevaluated expressions是上面提到的加上 decltype (您不想使用)和 requires (C++20)。

关于c++ - 不使用 decltype 复制相同的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64574964/

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