如何将类成员专用于多个模板值(常量)?
How to specialize a class-member for multiple template values (constants)?
我想专门化模板类的成员方法。此模板类具有 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);
}
相关文章:
- 私有类型的静态常量成员
- constexpr构造函数需要常量成员函数时出现问题
- Clang 格式 10.0 与 5.0 常量成员函数的格式不同
- 为什么"具有常量成员的结构"类型的指针不能指向"具有非常量成员的结构"?
- 常量成员函数中成员变量的类型
- 如何处理运算符=中的常量成员?
- 常量成员和没有setter的私有成员之间有什么区别
- C++:允许临时对象调用非常量成员函数的设计理念是什么?
- 移动具有常量成员的类的构造和分配
- ARM C++编译器不会编译具有可变常量成员的结构
- 强制在编译时计算类的类的常量成员
- 类中常量成员函数的 c++ 链接错误
- 为什么常量成员可以初始化两次?
- 专用常量成员函数的成员检测
- 与其他静态const成员初始化静态常量成员
- 具有静态和常量成员变量的对象
- 结构中的常量成员即使在初始化后也返回 0
- 在非常量成员函数中,为什么点这个非常量,而 decltype 指针这是常量
- 有没有一种通用方法来"unprotect"静态常量成员?
- 如何初始化共享复杂初始化代码的多个常量成员变量?