ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c-可变参数模板运算符<<

2019-10-09 08:17:28  阅读:227  来源: 互联网

标签:c operator-overloading variadic-templates


我试图将我的一些函数foo()更改为operator<<(),只是为了使某些“ half C / half C”代码看起来更像C.发生了,但是,我陷入了以下转换步骤:

template <class... T>
inline const size_t foo(const T&... data) {
    return sizeof...(T);
}
struct bar {
    template <class... T>
    inline const size_t operator<<(const T&... data) {
        return sizeof...(T);
    }
};
int main(int argc, char *argv[]) {
    bar a;
    std::cout << ">>> length " << foo(1, 2, 3) << std::endl;
    std::cout << ">>> length " << (a << 1 << 2) << std::endl;
    std::cout << ">>> length " << (a << 1 << 2 << 3) << std::endl;
    std::cout << ">>> length " << (a << 1 << 2 << 3 << 4) << std::endl;
}

从输出:

$./a.out 
>>> length 3
>>> length 4
>>> length 32
>>> length 512

我得出结论,第一计算是在<<< 1,随后的值会相应移动.但是,我没有看到如何重写foo(),从而为struct bar用户提供了一个操作符<<()接口-当然,无需更改foo()语义. 如果无法将类T …作为参数传递给operator<<(),该函数自然会比foo()效率低,因为它将多次调用.是否有任何合理的C构造,还是坚持foo()是这里唯一/最好的选择? 语境: 这些foo()函数是网络通信的发送者/接收者.我认为最好是提供一个带有发送者/接收者流,使用<<<和>>运算符-除了使用常规函数foo(…).

解决方法:

语言正在执行您要执行的操作.

对于关联性,以下是等效的(<和>是从左到右的关联):

a << 1 << 2
(a << 1) << 2

呼叫<< 1调用用户定义的运算符,该运算符又返回size_t.因此,下次呼叫的类型如下:size_t<< int(这是一个简单的按位移位). 您需要使用表达式模板.想法如下(live example here):

template<typename... args>
struct stream_op
{
};

template<typename... A, typename B>
stream_op<A..., B> operator<<(stream_op<A...> a, B b)
{
    // Do stuff
}

因此,发生以下情况(以a作为stream_op):

a << 1 << 2
------
  |
  v
-------------------------------------------
stream_op<int> operator<<(stream_op<>, int) << 2
--------------                                ---
     |                                         |
     |             +---------------------------+
     v             v
--------------    ---
stream_op<int> << int
--------------    ---
       |           |
       |           +---------------------------+
       +----------------------------+          |
                                    v          v
                              --------------  ---
stream_op<int,int> operator<<(stream_op<int>, int)
------------------
        |
        v
------------------
stream_op<int,int> // <- Expected result

然后,您只需要放置一个方法即可将stream_op转换为int(或任何您想要的类型).

关于性能的说明:使用这些表达式模板,部分数据以类型进行编码,因此通常它应与直接调用foo(…)一样快.

标签:c,operator-overloading,variadic-templates
来源: https://codeday.me/bug/20191009/1877771.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有