代码之家  ›  专栏  ›  技术社区  ›  Alex Reinking

C++模板可以用来推迟对它们的参数的评估吗?

  •  0
  • Alex Reinking  · 技术社区  · 7 年前

    我正在开发一个代码库,其特点是宏的行为基本上如下所示:

    struct to_void {
        template<class T>
        inline void operator&&(T&& t) {}
    };
    
    #define cout_if(c) (!(c)) ? ((void)0) : to_void() && std::cout
    
    // --
    
    extern int expensive_op(int c);
    void foo(int a, int b) {
        cout_if(a < b) << expensive_op(a + b);
    }
    

    是否可以创建一个保留 cout_if 同时也阻止了对 a + b expensive_op 如果不需要它们?我可以看到这类东西在其他环境中很有用(例如,在嵌入式dsl中),但是宏看起来很脆弱。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Michael Kenzel    7 年前

    我不认为你所要求的不改变语法或修改是可能的 expensive_op . 基本问题是,无论您做什么,在调用重载运算符时,操作数已经被求值,因为它们必须作为参数传递给运算符函数。我不认为只有在函数实现内部做一些事情,就可以避免对函数调用的参数求值。因此,不可能有办法达到你的要求

        2
  •  2
  •   Henri Menke    7 年前

    在没有预处理器的情况下不可能做到这一点,并且仍然要维护语法。一个微创的变种需要将呼叫包裹起来 expensive_op

    #include <iostream>
    
    extern int expensive_op(int c);
    
    class cout_if {
        bool m_b;
    public:
        cout_if(bool b) : m_b{b} {};
        template <typename T>
        std::ostream& operator<<(T&& rhs) {
            if (m_b) { return std::cout << rhs(); }
            return std::cout;
        }
    };
    
    void foo(int a, int b) {
        cout_if(a < b) << [a,b] { return expensive_op(a + b); };
    }