一种保证一堆派生 类 具有静态函数的方法,它们做同样的事情并且保证以相同的方式命名?

A way to guarantee that a bunch of derived classes have static functions that do the same thing and that are guaranteed to be named in the same way?

我知道 class 方法不可能既是纯虚拟的又是静态的(参见 this discussion)。所以,我问:有没有办法保证一堆派生的 classes 有静态函数做同样的事情并且保证以同样的方式命名?

考虑以下 example

#include <iostream>
#include <array>

// class base {
// public:
//  virtual static constexpr size_t nums() = 0
// }

template<size_t num>
class derived1 {//: public base {
public:
    static constexpr size_t nums() {return num;}
    derived1()  {}
};

template<size_t num>
class derived2 {// : public base {
public:
    static constexpr size_t nums() {return num;}
    derived2()  {}
};

int main() {

    std::cout << derived2<20>::nums() << "\n";
    return 0;
}

我注释掉了基础 class 以便它编译,但我想要一个接口 class 来保证一堆派生的 classes 都具有 nums() 命名以同样的方式。在这个特定的例子中,nums 在两个派生 class 中的命名方式相同,但如果我在几年后写第三个派生 class,而我忘记了这个约定,我不会理想情况下,我不想编译任何东西。

您可以使用 CRTP 作为基础 class,然后有一个例程依赖于已实现预期静态函数的派生 class。

这是一个示例,我在基础 class 中有 thunk_nums 依赖于具有 nums 的派生 class,尽管它们可以被命名为相同的。

请注意,如果未使用某个函数,则不会生成该函数,因此不会触发错误。 (这可能是所需的行为,或者如果不需要,则必须采取措施以确保生成它。)

#include <iostream>

template <typename DERIVED>
class base {
public:
    static constexpr size_t thunk_nums() {
        return DERIVED::nums();
    }
};

template<size_t num>
class derived1 : public base<derived1<num>> {
public:
    static constexpr size_t nums() {return num;}
    derived1() {}
};

template<size_t num>
class derived2 : public base<derived2<num>> {
public:
    static constexpr size_t nums() {return num;}
    derived2() {}
};

int main() {
    std::cout << derived2<20>::thunk_nums() << "\n";
}