c ++静态模板子类

时间:2016-03-18 15:22:31

标签: c++ templates static-methods

我已经读过为什么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()

1 个答案:

答案 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.
};