在C++中,在编译时强制执行函数调用



C++中是否有一种方法可以在编译时强制执行函数调用,从而允许此调用:

obj.reset().setParam1(10).setParam2(20);

但这个将无法编译:

obj.reset().setParam1(10);

我想避免在一个函数中设置所有参数,因为要设置的参数太多了;所以我更喜欢使用类似于命名参数习惯用法的东西。

编辑:替代语法可以是:

obj.reset(setParam1(10), setParam2(20));

obj.reset(setParam1(10).setParam2(20));

由于所需的行为必须在编译时出现,因此需要在类型系统中实现。据我所知,这在C++中是不可能的——命名参数习惯用法依赖于具有相同返回类型(即被调用对象的类型)的setter函数,因此无法阻止对某些方法的调用。

我将用您提供的2个参数给您举一个例子,如果您需要更多,它需要更多的工作。如果参数之间的需求层次结构变得太复杂,你可能会发现很难构建你的类,但它是这样的:

class Obj {
    Obj2 setParam2(int v);
}
class Obj2: public Obj {
    Obj2 setParam1(int v);
}
int main() {
    Obj obj;
    obj.setParam2(10); // possible
    obj.setParam2(10).setParam1(20); // possible
    obj.setParam1(20); // not possible
    obj.setParam1(20).setParam2(10); // unfortunately not possible
    // Edit: one more limitation- consecutive calls are not possible, 
    // you must chain
    obj.setParam2(20);
    obj.setParam1(10); // problem
}

我能做的最好的事情就是提供这两个命名参数并强制初始化所有这些参数。

template<typename T>
struct Setter
{
    Setter(const T &param) : ref(param) {}
    const T &ref;
};

typedef Setter<int> Param1;
typedef Setter<std::string> Param2;

struct CObj
{
    void reset(const Param1 &A, const Param2 &B) {
            setParam1(A.ref); setParam2(B.ref); }
    void setParam1(int i) { param1 = i; }
    void setParam2(const std::string &i) { param2 = i; }
    int param1;
    std::string param2;
};

int main()
{
    CObj o;
    o.reset(Param1(10), Param2("hehe"));
}

最新更新