【问题标题】:How to make an "operator" variable? (C++)如何制作“运算符”变量? (C++)
【发布时间】:2009-06-14 02:56:51
【问题描述】:

我正在制作一个表达式类:

template<typename T, typename U>
class expression
{
public:
    expression(T vala, U valb, oper o){val1 = vala; val2 = valb; op = o;}
    operator bool{return(val1 op val2);}
private:
    T val1;
    U val2;
    oper op;
};

如您所见,这有点伪代码,因为我需要一个操作符类。我最初的想法是创建一个包含所有可能运算符的数组,然后通过字符串将其转换,但这不起作用,因为运算符数量众多,以及如何将其转换为字符串,除了通过二维数组,其中 n[0][0] 具有第一个运算符,而 n[0][1] 具有该运算符字符串。

有人对我的表达式类添加运算符值有什么建议吗?

【问题讨论】:

    标签: c++ operators expression operator-keyword


    【解决方案1】:

    C++ 表达式模板技术中使用了类似的方法。

    您可以使用 apply 或 evaluate 之类的方法将表达式创建为类。此方法接受参数并应用表达式。

    看看使用了哪些表达式模板。 http://www.angelikalanger.com/Articles/Cuj/ExpressionTemplates/ExpressionTemplates.htm https://www.cct.lsu.edu/~hkaiser/spring_2012/files/ExpressionTemplates-ToddVeldhuizen.pdf

    作为你的例子:

    struct isEqual
    {
        template <typename T, typename U>
        bool operator()(T a, U b)
        {
            return a == b;
        }
    };
    
    template <typename T, typename OP>
    struct expression
    {
        T& a;
        T& b;
        OP& op;
    
        expression(T a, T b, OP op) : a(a), b(b), op(op) {}
    
        void eval() { op(a,b); }
    };
    
    
    int main()
    {
        expression<int, isEqual> exp(1,2,isEqual());
        exp.eval();
    }
    

    【讨论】:

      【解决方案2】:

      也许是一个函数指针。而不是...

      operator bool{return(val1 op val2);}
      

      ...将其编码为...

      operator bool{return op(val1, val2);}
      

      ... 在这种情况下,op 可以是指向(任意)函数的指针,该函数接受两个参数并返回 bool。

      template<typename T, typename U>
      class expression
      {
      public:
          //define pointer-to-function type
          typedef bool *oper(const T& val1, const U& val2);
          ... etc ...
      

      【讨论】:

      • 我使用 typedef 来定义 'oper' 类型是什么,OP 将其作为参数传递给表达式构造函数:我是说它是一个指向函数的指针,它接受两个参数并返回布尔值。
      【解决方案3】:

      我不完全确定你在问什么,但如果你试图将任意字符串作为运算符重载,你不能。有一组有限的运算符可以在 C++ 中重载

      请看这里:http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

      你应该做的是在 oper 中重载 operator() 以创建一个函数对象并返回 op(val1, val2)。

      【讨论】:

        【解决方案4】:

        您可以使用功能标准库并将您的论点作为:

        std::tr1::function<bool (T,U)>
        

        即:

        #include <functional>
        
        template<typename T, typename U>
        class expression
        {
        public:
           expression(T vala, U valb, oper o) : val1(vala), val2(valb), op(o)
           { }
           operator bool{return op(val1, val2);}
        private:
           T val1;
           U val2;
           std::tr1::function<bool (T,U)> op;
        };
        

        然后,创建一个表达式:

        #include <functional>
        
        expression<int, int> foo(4,3, std::tr1::bind(greater()));
        

        这是tutorial

        【讨论】:

          猜你喜欢
          • 2016-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-27
          相关资源
          最近更新 更多