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.
};
我已经阅读了为什么 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.
};