繁体   English   中英

C ++静态模板子类

[英]c++ static template subclasses

我已经读到了为什么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";

这以及它的各种变化都失败了。 首先,它说在Reader中没有声明filename ,这听起来很合理。 因此,我在那里声明了一个static const char* filename ,并计划使用OneValue::filename遮盖Reader::filename OneValue::filename ,因为以后再使用它时,我将调用OneValue::getValue() -我知道类型当我打电话的时候

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

有没有一种方法可以干净地做我想要的事情,而无需大量代码复制? 我对全新的表达持开放态度,只是希望它简洁明了-上面的代码虽然具有人为的名称,但实际上是我希望实现的Reader类的全部,因此请重新定义一些getValue()每个派生类中的工作要比期望的多,这是因为可能需要花费更多的行来进行派生和重写,而不仅仅是为每个类重新实现getValue()

解决此类问题的常用方法是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.
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM