【问题标题】:Compile time overloading for ostream operatorostream 运算符的编译时重载
【发布时间】:2019-09-21 16:43:28
【问题描述】:

我正在尝试引入基于对象等级的重载机制。 我设法实现了基于other 帖子的简单示例,它适用于简单类型: https://coliru.stacked-crooked.com/a/8129de0ae8a71af1

现在我想为自定义类型做类似的事情:

#include <iostream>
#include <type_traits>
#include <sstream>

class Foo {
};

template < class T,
               typename std::enable_if <(std::rank<T>::value == 0), int>::type = 0 >
    void f(std::ostream& os, const T& value)
    {
        os << "rank: 0" << std::endl;
    }

    template< class T,
             typename std::enable_if<(std::rank<T>::value == 1), int>::type = 0 >
    void f(std::ostream& os, const T& value)
    {
        os << "rank: 1" << std::endl;
    }

    template <class T>
    std::ostream& operator<<(std::ostream& os, const T& foo)
    {
        f<decltype(foo)>(os, foo);
        return os;
    }

int main()
{
    Foo foo0;
    Foo foo1[5];

    //std::cout << std::rank<decltype(foo0)>{} << "\n"; // 0
    //std::cout << std::rank<decltype(foo1)>{} << "\n"; // 1

    // correct
    f<decltype(foo0)>(std::cout, foo0); //prints: rank: 0
    f<decltype(foo1)>(std::cout, foo1); //rank: 1

    // invalid
    std::cout << foo0; //prints: rank: 0
    std::cout << foo1; //rank: 0

    return 0;
}

https://coliru.stacked-crooked.com/view?id=cf91cec14a111f70

当我直接调用函数时,我收到了有效的结果,但是当我通过

【问题讨论】:

    标签: c++ templates operator-overloading c++14 enable-if


    【解决方案1】:

    这里不用decltype,直接用T即可:

    template<class T>
    std::ostream& operator<<(std::ostream& os, const T& foo)
    {
        f< T >(os, foo);
        return os;
    }
    

    但是当使用decltype 时,您必须从foo 类型中删除引用:

    template<class T>
    std::ostream& operator<<(std::ostream& os, const T& foo)
    {
        f< std::remove_reference_t< decltype(foo) > >(os, foo);
        return os;
    }
    

    当模板类型推导起作用时,T 被推导为 Foo [5] - rank 支持的。但是当你执行decltype(foo) 时,它返回的类型也是const &amp; - 所以你有const Foo (&amp;)[4]rank 那个东西是行不通的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-10
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      相关资源
      最近更新 更多