C++;自定义控制台类-如何处理<<&引用;运营商没有';你没有超载吗? 我在Windows中编写了一个C++控制台,它希望打印出任何对象,或者至少处理每个对象。
这是我的WriteLine方法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
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>{});
}