C++ 复制相同的行为而不使用decltype

C++ 复制相同的行为而不使用decltype,c++,templates,c++17,sfinae,C++,Templates,C++17,Sfinae,下面的代码对于快速调试非常方便。它可以漂亮地打印STL中的向量等容器,同时还可以使用SFINAE技术为基本类型和可流式类型提供打印属性 我想在不使用decltype的情况下复制相同的行为。任何其他复制这种行为的巧妙技术都将对我心目中的一些项目的实现非常有帮助。当前线程也可以被视为线程的延续(我也这么认为)。我设法在C++20(GCC 10.2.0)中使用概念而不使用decltype实现了一个整洁的工作,但我希望能够在C++17(GCC 9.2.0)和更低版本中实现(显然,没有概念,也没有提到de

下面的代码对于快速调试非常方便。它可以漂亮地打印STL中的向量等容器,同时还可以使用SFINAE技术为基本类型和可流式类型提供打印属性

我想在不使用
decltype
的情况下复制相同的行为。任何其他复制这种行为的巧妙技术都将对我心目中的一些项目的实现非常有帮助。当前线程也可以被视为线程的延续(我也这么认为)。我设法在C++20(GCC 10.2.0)中使用
概念
而不使用
decltype
实现了一个整洁的工作,但我希望能够在C++17(GCC 9.2.0)和更低版本中实现(显然,没有概念,也没有提到decltype)

命名空间调试{
模板
等级范围{
公众:
不要开始,不要结束;
};
模板
自动生成范围(常数T&b、常数T&e)->范围{
返回{b,e};
}
模板
auto是可流化的对象(T*x)->decltype(std::cerr decltype(std::false_type());
类视图{
私人:
标准::ostream&stream;
公众:
视图(std::ostream&os=std::cerr):流(os)
{ };
~view()

{stream当然,这里有一个使用
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 {};
模板
struct是可流化的对象:std::false_type{};
模板

struct是可流的\u Objective你有什么理由想要一个替代品来代替
decltype
吗?只是好奇没什么错,但我想知道你是否有一个特定的原因。@cigien只是好奇。我不喜欢在我写的代码中看到decltype:pHaha,好吧。我必须说,你不太可能喜欢替代品的样子。阿奇如果不使用该关键字,那么使用decltype
语义可能会在语法上更加令人不快:p@cigien哦!好吧,知道其他技术也没什么坏处,呵呵。如果像你提到的那样不愉快,那将是一次很好的学习经历(这也由我来决定:).我喜欢decltype的功能,但当我阅读别人的代码时,我发现它相当混乱,因此我在处理小项目时尽量不使用它(除非我没有我知道的替代方案).添加到语言中的
decltype
是有原因的。不,学习pre-
decltype
SFINAE技术对你一点好处都没有。最好花些时间来适应
decltype
,尤其是在pre-C++20sfinae中。这太完美了!我发现这种东西比使用decltype更干净4次,以简单地评估某些内容是否可流化。也感谢您提供的额外详细信息!您不需要使用decltype 4次-一次就足够了(使用std::void\t).Example:ecatmur您可能已经意识到我在这方面不是很有经验:)在我的原始代码中,我使用了4个decltype,它看起来非常复杂,因为我实现了一些简单的东西,所以我来到这里。再次感谢您提供的示例!