C++静态模板子类

c++ static template subclasses

我已经阅读了为什么 static virtual 方法没有任何意义 - 函数是 virtual 以便它可以被实现覆盖,或者它是 static 因为type 在编译时是已知的,不能两者都是。我想知道是否有办法做我正在尝试的事情:

我有相同的基本结构来读取一些预配置的值:

// in some header
template < typename TYPE >
class Reader {
public:
    static TYPE getValue() {
        static TYPE value;
        static SomeFileClass(filename, &value, sizeof(value));
        return value;
    }
};

class OneValue : public Reader<uint16_t> {
public:
    static const char* filename;
};
// and maybe OtherValue : public Reader<SomeUserType> {}; etc etc.

// in main.cpp, for example
const char* OneValue::filename = "onevalue.txt";

这个,以及这个的各种变体,都失败了。首先它说 filename 没有在 Reader 中声明,这听起来很合理;所以我在那里声明了一个 static const char* filename,并计划用 OneValue::filename 故意隐藏 Reader::filename,因为当我稍后使用它时,我会调用 OneValue::getValue() - 我知道打电话的时候打字。

然而,这不起作用,因为 Reader::filename 没有定义,但是当我定义它时,它说模板使用没有模板参数`这听起来也是一个合理的错误,但现在我是没主意了。

有没有一种方法可以干净地做我想做的事,而不需要大量的代码复制?我对全新的公式持开放态度,只是希望它清晰简洁 - 上面的代码虽然有人为的名称,但实际上是我希望实现的 Reader class 的全部,因此,在每个派生的 class 中重新定义一些 getValue() 比预期的要多,因为派生和覆盖可能需要更多行,而不是为每个 [= 重新实现 getValue() 34=].

这类问题通常的解决方法是CRTP:

template < typename TYPE, typename Derived >
//                      ^^^^^^^^^^^^^^^^^^
class Reader {
public:
    static TYPE getValue() {
        static TYPE value;
        static SomeFileClass(Derived::filename, &value, sizeof(value));
        //                   ^^^^^^^^^
        return value;
    }
};

class OneValue : public Reader<uint16_t, OneValue> {
//                                     ^^^^^^^^^^
// etc.
};