簡體   English   中英

C ++避免了const和非const訪問的代碼重復

[英]C++ avoiding code duplication for const and non-const visitation

我有一個類應該為每個成員變量調用一個訪問者方法。 像這樣的東西:

class A{
    int a, b, c;

public:
    void accept(Visitor &visitor){
        visitor.visit(a);
        visitor.visit(b);
        visitor.visit(c);
    }
};

如何在沒有代碼重復的情況下使用相同的代碼獲取void accept() const方法?

重復的顯而易見的解決方案是添加一個方法:

void accept(Visitor &visitor) const {
    visitor.visit(a);
    visitor.visit(b);
    visitor.visit(c);
}

該方法具有我想要的含義,但我想避免代碼重復。 擁有這兩種方法的原因是能夠通過'reading'訪問者讀取變量並使accept方法具有良好的const 然后非const accept可以用於“寫/更新”訪問者。

您可以創建一個類靜態模板輔助函數,該函數將根據您提供給它的this指針的類型推導出constness。 像這樣:

class A{
    int a, b, c;

public:

    void accept(Visitor &visitor){
        acceptImpl(*this, visitor);
    }
    void accept(Visitor &visitor) const{
        acceptImpl(*this, visitor);
    }

private:
    template<typename t_A>
    static void acceptImpl(t_A& aObj, Visitor &visitor)
    {
        visitor.visit(aObj.a);
        visitor.visit(aObj.b);
        visitor.visit(aObj.c);
    }
};

模板助手:

class A{
    int a, b, c;

private:
    template <typename T>
    static void do_visiting(T &self, Visitor &visitor) {
        visitor.visit(self.a);
        visitor.visit(self.b);
        visitor.visit(self.c);
    }
public:
    void accept(Visitor &visitor) {
        do_visiting(*this, visitor); // calls do_visiting<A>
    }
    void accept(Visitor &visitor) const {
        do_visiting(*this, visitor); // calls do_visiting<const A>
    }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM