gpt4 book ai didi

c++ - 虚拟调试类卡在 std::endl 重载上

转载 作者:行者123 更新时间:2023-11-30 02:25:40 26 4
gpt4 key购买 nike

我想我会做一个快速而肮脏的 __DEBUG 启用跟踪,像这样:

#ifdef __DEBUG
# define dbg std::cout
# define err std::cerr
#else

#include <iostream>

class dummy_cout
{
private:

public:
dummy_cout & operator << ( auto &obj )
{ return *this; }

dummy_cout & operator << ( std::result_of< decltype( &std::endl ) >::type &obj )
{ return *this; }
};

# define dbg dummy_cout()
# define err dummy_cout()
#endif


int main( int argc, char *argv[] )
{
dbg << "Bla, bla. bla..." << std::endl;
}

但它给了我:

cond_dbg.cpp:16:66: error: decltype cannot resolve address of overloaded function
dummy_cout & operator << ( std::result_of< decltype( &std::endl ) >::type &obj )

我还尝试了 decltyperesult_ofostream 等六种变体,但我仍然没有得到任何更进一步。

它应该很简单。如果我编译定义 __DEBUG 的代码,我将得到 coutcerr。如果我进行正常编译,我会有我的 dummy_cout,它什么都不做,只是允许我的代码在没有更改和很少困惑的情况下进行编译。

任何帮助将不胜感激。

最佳答案

你不能写decltype(&std::endl)因为 std::endl 不是一个函数,它是一个函数模板:

template< class CharT, class Traits >
std::basic_ostream<CharT, Traits>& endl( std::basic_ostream<CharT, Traits>& os );

因此,它没有类型,因此要求它没有意义。此外,即使它确实有类型,后续的 result_of包装没有任何意义。

std::cout << std::endl的原因有效的是有一个 overload接受特定类型的函数指针:

basic_ostream& operator<<(
std::basic_ios<CharT,Traits>& (*func)(std::basic_ios<CharT,Traits>&) );

此运算符不是函数模板(它是 basic_ostream 的成员函数,它是一个类模板),因此此处的重载解析会触发 endl 的特化实例化。 .

要让它工作,你应该做同样的事情:

dummy_cout& operator<<( std::ostream&(*p)(std::ostream&) );

或选择一些合适的CharTTraits对于您的虚拟类型:

dummy_cout& operator<<( std::basic_ostream<C,T>&(*p)(std::basic_ostream<C,T>& ) );

只是一个注释。此声明在任何 C++ 标准中都是错误格式的:

dummy_cout& operator<<(auto& obj);

简洁的函数模板语法是 Concepts TS 的一个特性,它仍然是一个 TS。除非你使用 - fconcepts ,你需要写:

template <class T>
dummy_cout& operator<<(T& obj);

关于c++ - 虚拟调试类卡在 std::endl 重载上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43987765/

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