Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;自定义控制台类-如何处理<<&引用;运营商没有';你没有超载吗? 我在Windows中编写了一个C++控制台,它希望打印出任何对象,或者至少处理每个对象。_C++_Console - Fatal编程技术网

C++;自定义控制台类-如何处理<<&引用;运营商没有';你没有超载吗? 我在Windows中编写了一个C++控制台,它希望打印出任何对象,或者至少处理每个对象。

C++;自定义控制台类-如何处理<<&引用;运营商没有';你没有超载吗? 我在Windows中编写了一个C++控制台,它希望打印出任何对象,或者至少处理每个对象。,c++,console,C++,Console,这是我的WriteLine方法 template<typename T> inline void WriteLine(const T& t) { std::cout << t << "\n"; } 模板 内联无效写入线(常数T&T) { std::cout您应该能够使用和标记分派来完成此操作: template <class T, class = void> struct HasInserter : std::false_ty

这是我的WriteLine方法

template<typename T>
inline void WriteLine(const T& t)
{
    std::cout << t << "\n";
}
模板
内联无效写入线(常数T&T)
{

std::cout您应该能够使用和标记分派来完成此操作:

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

template <class T>
struct HasInserter<T, std::void_t<decltype(std::declval<std::ostream&>() << std::declval<const T>())>> :
  std::true_type
{};


template <class T>
void WriteLine(const T &t, std::true_type)
{
  std::cout << t << '\n';
}

template <class T>
void WriteLine(const T &t, std::false_type)
{
  std::cout << typeid(T).name() << '\n';
};


template <class T>
void WriteLine(const T &t)
{
  WriteLine(t, HasInserter<T>{});
}
模板
结构HasInserter:
std::false_类型
{};
模板

struct HasInsertery您可以编写
运算符的专用、独立的重载,我知道,但我想知道是否有一种方法可以允许console类处理不存在重载的语句?感谢您的快速响应!@RobertGray,使用SFINAE,或者使用继承解决此问题如果使用boost,您可以看到这是一种称为detect的方法吗ion习语?@不可数不知道;可能是。非常感谢,伙计!终于有一个stackoverflow用户,他以一种有帮助的、清晰的方式回答了一个问题,没有对伪代码吹毛求疵,也没有一般的异常!再次感谢:)
template<typename T>
inline void WriteLine(const T& t)
{
    //check if the object has an overloaded << operator  
    if(itdoes){
        //then print as normal
        std::cout << t;
    }
    else {
        //if it hasn't been overloaded, just print the type of the object using <typeinfo>
        std::cout << typeid(T).name()
    }
}
template <class T, class = void>
struct HasInserter :
  std::false_type
{};

template <class T>
struct HasInserter<T, std::void_t<decltype(std::declval<std::ostream&>() << std::declval<const T>())>> :
  std::true_type
{};


template <class T>
void WriteLine(const T &t, std::true_type)
{
  std::cout << t << '\n';
}

template <class T>
void WriteLine(const T &t, std::false_type)
{
  std::cout << typeid(T).name() << '\n';
};


template <class T>
void WriteLine(const T &t)
{
  WriteLine(t, HasInserter<T>{});
}