编写C ++模板来评估表达式 - 指针错误?

时间:2016-04-08 14:04:25

标签: c++ templates

我正在编写C ++模板来评估带变量的表达式。基本上,对于像(x + 5)*(x-2)这样的结构,它将评估任何变量x的整个表达式。这是相关的代码:

.cpp文件:

int main(int argc, const char * argv[]){

    int x = 5;
    typedef MULTIPLY <
        ADD < VAR, LIT<5> >,
        SUBSTRACT < VAR, LIT<2> >
    >
    EXPRESSION;

    EXPRESSION e;

    printf("(x+5)*(x-2) = %d for x=%d", e.eval(x), x);

    return 0;

}

头文件:

struct VAR{
    static inline int eval(int i){ return i; };
};

template<int INT>
struct LIT{
    static inline int eval(int i){ return INT; };
};

template<class L, class R>
struct ADD{
    static inline int eval(int i){
        return L::eval(i) + R::eval(i);
    };
};

template<class L, class R>
struct SUBSTRACT{
    static inline int eval(int i){
        return L::eval(i) - R::eval(i);
    };
};

template<class L, class R>
struct MULTIPLY{
    static inline int eval(int i){
        return L::eval(i) * R::eval(i);
    };
};

正确执行时打印出来

(x+5)*(x-2) = 30 for x=5

现在,我正在尝试扩展此代码以接受变量数组。所以

int arr[2] = {1,2};

给予

(x+y)

应该按顺序放置变量,并使用数组中的2个(或任意数量)单独值计算相同的东西(超简单示例)。

.cpp文件:

int main(int argc, const char * argv[]){

    int arr[2] = {1,2};
    typedef ADD < VARS<2>, VARS<2> >
    EXPRESSION;

    EXPRESSION e;

    printf("(x+y) = %d\n", e.eval(arr));

    return 0;

}

这就是我被卡住的地方。这就是我在头文件中的内容:

//take an array arr[] of size N
template<int N>
struct VARS{
    static inline int eval(int arr[]){
        //go for next value
        VARS<N-1>::eval(arr+1);
        //end return current one
        return arr[0];
    };
};

// if array size = 0, end execution
template<>
struct VARS<0>{
    static inline int eval(int arr[]){ return 0; };
};

template<class L, class R>
struct ADD{
    static inline int eval(int i){
        return L::eval(i) + R::eval(i);
    };
};

但是当我尝试编译它时,我得到了一堆错误:

ExpressionTemplate.cpp: In function 'int main(int, const char**)':
ExpressionTemplate.cpp:17:35: error: invalid conversion from 'int*' to 'int' [-fpermissive]
  printf("(x+y) = %d\n", e.eval(arr));
                                   ^
In file included from ExpressionTemplate.cpp:5:0:
ExpressionTemplate.h:19:23: note:   initializing argument 1 of 'static int ADD<L, R>::eval(int) [with L = VARS<2>; R = VARS<2>]'
     static inline int eval(int i){
                       ^
ExpressionTemplate.h: In instantiation of 'static int ADD<L, R>::eval(int) [with L = VARS<2>; R = VARS<2>]':
ExpressionTemplate.cpp:17:35:   required from here
ExpressionTemplate.h:20:23: error: invalid conversion from 'int' to 'int*' [-fpermissive]
         return L::eval(i) + R::eval(i);
                       ^
ExpressionTemplate.h:6:23: note:   initializing argument 1 of 'static int VARS<N>::eval(int*) [with int N = 2]'
     static inline int eval(int arr[]){
                       ^
ExpressionTemplate.h:20:36: error: invalid conversion from 'int' to 'int*' [-fpermissive]
         return L::eval(i) + R::eval(i);
                                    ^
ExpressionTemplate.h:6:23: note:   initializing argument 1 of 'static int VARS<N>::eval(int*) [with int N = 2]'
     static inline int eval(int arr[]){

任何帮助都将非常感激:)

1 个答案:

答案 0 :(得分:4)

您的代码正在将int s(衰减为int*)数组传递到ADD的{​​{1}}函数中。但是您定义了eval来获取单个ADD::eval。您需要向int添加另一个函数以说明传入数组时的情况,或者创建一个新类(即ADD)来处理这种情况。