重构 - 删除CRPT

时间:2017-10-15 17:27:46

标签: c++11 templates refactoring

我有这样的自定义List类:

template<class T>
struct iList{
    constexpr bool empty() const{
        return static_cast<const T *>(this)->size() == 0;
    }

    // several methods like empty(), some are non const.
};

// there are several classes like this one with different implementations
struct MyList : iList<MyList>{
    constexpr unsigned size() const{
        return 5;
    }
};

int main(){
    constexpr MyList list;
    static_assert( ! list.empty() );
}

代码为constexpr并已简化,因此我可以使用static_assert

我想摆脱CRTP模式,因为模板变得太难看了。但是我不想使用虚函数。

我正在考虑的一种方式是:

struct iList2{
protected:
    template<class LIST>
    constexpr static bool empty_(const LIST &list){
        return list.size() == 0;
    }
};

struct MyList2 : iList2{
    constexpr unsigned size() const{
        return 5;
    }

    constexpr bool empty() const{
        return empty_(*this);
    }
};

int main(){
    constexpr MyList2 list2;
    static_assert( ! list2.empty() );
}

在这种情况下,我需要在每个列表中调用empty_静态成员函数。

另一种方法是使用mixin,例如继承MyList并添加empty()方法。如果我这样做模板类,我甚至可以制作typedef。但是我也不喜欢这种方法。

我有可能失踪吗?

0 个答案:

没有答案