懒惰的评估实现不会编译

时间:2014-06-21 23:55:40

标签: c++ lazy-evaluation member-function-pointers

以下代码有一个promise类,它接受来自此类和输入的类,函数,并在被要求时将其计算为结果var。有一个vector类可以用promise和promise测试类初始化,为了这个问题的目的,它实现了调整矢量变量大小的承诺。

在主要内容中,我创建了两个promise测试变量:一个用于vector int,另一个用于vector double。问题是代码将无法编译,如下所示(使用g ++ SUSE Linux 4.3.4修订版152973),但如果删除t1v1,则编译并运行正常。我得到的编译错误说编译器无法看到vector double变量的模板promise构造函数。

任何想法可能会发生什么?它就像测试/矢量对的第一个实例化影响第二个。

#include <iostream>                                                                                                                   
#include <vector>                                                                                                                         

using namespace std;

#define FUNC(O, I, R, F) void(O::*F)(const I&, R&) const
template<typename O, typename I, typename R, FUNC(O, I, R, F)>
struct promise
{
    promise(const O& _o, const I& _x) : o(_o), x(_x)
    { }

    inline void eval_into(R& r) const
    {
        (o.*(F))(x, r);
    }

    const O& o;
    const I& x;
};

template<typename T>
struct vec: public vector<T>
{
    typedef vector<T> base;
    vec(const vec& v) : base(v)
    { }

    vec() : base()
    { }

    template<typename O, typename I, FUNC(O, I, vec, F)>
    vec(const promise<O, I, vec, F>& p)
    {
        p.eval_into(*this);
    }
};

template<typename T>
struct promise_test
{
    typedef vec<T> vect;
    inline void eval_f(const int& s, vect& r) const
    {
        r.resize(s);
    }

    typedef promise<promise_test, int, vect, &promise_test::eval_f> promise_type;

    inline promise_type f(const int& s) const
    {
        return promise_type(*this, s);
    }
};

int main(int argc, char** argv)
{
    int x = 5;

    promise_test<int> t1;
    vec<int> v1(t1.f(x));

    promise_test<double> t2;
    vec<double> v2(t2.f(x));

    cout << v2.size() << endl;

    return 0;
}

0 个答案:

没有答案