如何将类成员专用于多个模板值(常量)?

How to specialize a class-member for multiple template values (constants)?

本文关键字:常量 成员 用于 专用      更新时间:2023-10-16

我想专门化模板类的成员方法。此模板类具有 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);

这将编译和链接。我想通过使用常量实例来简化该方法:

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

但是我无法找到正确的语法来使其工作。在保持我的用户代码不变的情况下,这是否可能?我想用C++俚语做什么的正确词和术语是什么?

问题不就是您试图将模板分为.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);
}
}

应该工作

也许你可以换一种方式 - 让全局变量成为由同一 int 邮箱参数化的类的静态成员。 例如:

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);
}