【问题标题】:How to avoid macros in instantiating my templated class?如何在实例化我的模板类时避免宏?
【发布时间】:2020-09-23 06:57:42
【问题描述】:

我们使用了大量的寄存器,都是位域的结构,例如

struct MyRegister { 
    uint32_t bit_field0 : 2;
    uint32_t bit_field1 : 5;
...
};
volatile MyRegister my_register; // Mapped by the linker to a specific address.

我想创建一个模板来帮助我创建影子寄存器。 比如:

Shadow<> my_register_shadow(my_register); // my_register_shadow is a variable initialized with my_register address and value (reads my_register value).
my_register_shadow.bit_field0 = 2; // Doesn't access to real register my_register.
my_register_shadow.bit_field1 = 6; // Doesn't access to real register my_register.
my_register_shadow.flush(); // Only now write to my_register.

我目前的解决方案:

template <typename T>
class Shadow : public T
{
public:
    Shadow(volatile T& reg) : T(reg), reg_(reg) {}
    void flush() { reg_ = *this; }
private:
    volatile T& reg_;
};

#define SHADOW_REG(SHADOW, REG) Shadow<decltype(REG)> SHADOW(REG)
SHADOW_REG(my_register, my_register_shadow); // Define my_register_shadow variable.
my_register_shadow.bit_field0 = 2; // Doesn't access to real register my_register.
my_register_shadow.bit_field1 = 6; // Doesn't access to real register my_register.
my_register_shadow.flush(); // Only now write to my_register.

我正在寻找没有宏的解决方案,有什么想法吗?

【问题讨论】:

  • c++17 允许您省略模板参数,因此您不需要宏
  • 如果你没有c++17,使用auto和一个辅助函数模板。 auto my_register_shadow = make_shadow(my_register);
  • 标题有点误导,因为您的问题实际上并不是关于“遮蔽”任何东西,而是关于避免使用宏...

标签: c++ templates c++14


【解决方案1】:

一个简单的模板工厂将满足您的需求:

template <typename T>
Shadow<T> createShadow(T& reg) { return {reg}; }

auto my_register_shadow = createShadow(my_register); // Define my_register_shadow variable.
my_register_shadow.bit_field0 = 2; // Doesn't access to real register my_register.
my_register_shadow.bit_field1 = 6; // Doesn't access to real register my_register.
my_register_shadow.flush(); // Only now write to my_register.

【讨论】:

    猜你喜欢
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多