如何为多个模板值(常量)专门化一个类成员?

时间:2017-07-13 07:41:31

标签: c++ templates template-specialization

我想专门化模板类的成员方法。此模板类具有int类型的常量模板参数,并且根据值必须选择不同的全局变量:

template <int INSTANCE>
class mailbox
{
public:
    void write(uint32_t v);
}

// global accessors of different instances
extern mailbox<0> mailbox0;
extern mailbox<1> mailbox1;

以及后来的.cpp文件

template<>
void mailbox<0>::write(uint32_t v)
{
    access(reg_0, v);
}

template<>
void mailbox<1>::write(uint32_t v)
{
    access(reg_1, v);
}

mailbox<0> mailbox0;
mailbox<1> mailbox1;

这允许我按如下方式使用邮箱:

mailbox0.write(0xdeadcafe);

这是编译和链接。我想通过使用常量INSTANCE来简化方法:

template<int INSTANCE>
void mailbox<INSTANCE>::write(uint32_t v)
{
    if (INSTANCE == 0)
        access(reg_0, v);
    else
        access(reg_1, v);
}

但是我无法找到合适的语法来使其发挥作用。在保持我的用户代码的同时,这是否可行?我想用C ++做什么是正确的单词和术语 - 俚语?

2 个答案:

答案 0 :(得分:2)

问题不只是你试图将模板分成.h和.cpp(实际上,在现行标准中很少可行)?

template <int INSTANCE>
class mailbox
{
public:
    void write(uint32_t v){
        if (INSTANCE == 0)
            access(reg_0, v);
        else
            access(reg_1, v);
    }
}

应该有效

答案 1 :(得分:1)

也许你可以采取其他方式 - 让全局变量成为由同一个int邮箱参数化的类的静态成员参数化。 e.g:

template <int INSTANCE>
struct reg {
    static RegType value;
};

template <int INSTANCE>
RegType reg<INSTANCE>::value;

然后访问reg值将是透明的,没有任何专业化:

template<int INSTANCE>
void mailbox<INSTANCE>::write(uint32_t v) {
    access(reg<INSTANCE>::value, v);
}

如果c ++ 17在游戏中你可以创建一个reg模板全局变量,让代码更简单:

template <int INSTANCE>
RegType reg;

template<int INSTANCE>
void mailbox<INSTANCE>::write(uint32_t v) {
    access(reg<INSTANCE>, v);
}

修改

如果您无法修改访问模式,则可以创建引用包装器数组(c ++ 11):

#include <functional>

std::reference_wrapper<RegType> regs[2] {reg_0, reg_1};

template<int INSTANCE>
void mailbox<INSTANCE>::write(uint32_t v) {
    access(regs[INSTANCE].get(), v);
}