小编Jef*_*ant的帖子

测试是否存在左移运算符

我正在尝试找到一个工作类型特征来检测给定类型是否具有左移位运算符重载std::ostream(例如,与std::cout或可互操作boost::lexical_cast).我已经取得了成功,boost::has_left_shift除了类型是POD或std::string类型的STL容器的情况.我怀疑这与STL类型或operator << functions的特化有关.使用有效左移运算符来一般识别类型的正确方法是什么std::ostream?如果这不可行,是否有一个单独的方法来检测POD或std :: string类型的STL容器上的左移位运算符的重载?

下面的代码显示了我当前正在使用的内容,并演示了即使在下一行调用它也boost::has_left_shift无法检测到重载operator<<函数.该程序在GCC 4.5.1或更高版本和clang 3.1中编译和工作.

为了避免明显的响应,我尝试用operator<<特定版本替换模板化函数,因为各种类型都没有用.我还尝试了两种类型的const-ness和l-value/r-values说明符的各种组合(各种调整引导我指向operator<<带有r值ostream 的重载的编译器消息).我也试过实现自己的特性,最多给我相同的结果boost::has_left_shift.

提前感谢您提供的任何帮助.如果能够详细解释为什么会出现这种行为以及解决方案如何工作,我也会非常感激.我正在扩展我的模板知识的极限,并且很想知道为什么这不起作用,正如我认为的那样.

#include <string>
#include <vector>
#include <iostream>
#include <boost/lexical_cast.hpp>
#include <boost/type_traits/has_left_shift.hpp>

using namespace std;

struct Point {
    int x;
    int y;
    Point(int x, int y) : x(x), y(y) {}
    string getStr() const { return "("+boost::lexical_cast<string>(x)+","+boost::lexical_cast<string>(y)+")"; }
};

ostream& operator<<(ostream& stream, const Point& p)
{
    stream << p.getStr();
    return …
Run Code Online (Sandbox Code Playgroud)

c++ boost stl type-traits

5
推荐指数
1
解决办法
1003
查看次数

标签 统计

boost ×1

c++ ×1

stl ×1

type-traits ×1