我想专门化模板类的成员方法。此模板类具有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 ++做什么是正确的单词和术语 - 俚语?
答案 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);
}