我已经读过为什么static virtual
方法没有任何意义 - 函数是virtual
所以它可以被实现覆盖,或者它是static
因为类型是在编译时已知,并且它不能同时存在。我想知道是否有办法做我正在尝试的事情:
我有一些相同的基本结构,可用于读取一些预先配置的值:
// 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
,并计划用Reader::filename
有意遮蔽OneValue::filename
,因为当我稍后使用它时,我会打电话给OneValue::getValue()
- 我知道当我打电话时输入。
然而,这不起作用,因为Reader::filename
没有定义,但是当我定义它时,它说模板使用没有模板参数`这听起来像是一个合理的错误,但现在我已经没有想法。
有没有办法干净地做我想要的,没有大量的代码复制?我对全新的公式持开放态度,只是希望它清晰简洁 - 上面的代码,虽然它有人为的名字,实际上是我希望实现的Reader
类的全部,所以重新定义每个派生类中的一些getValue()
比预期更多的工作,因为导出和覆盖可能需要更多的行而不是为每个类重新实现getValue()
。
答案 0 :(得分:4)
此类问题的常见解决方案是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.
};