gpt4 book ai didi

c++ - 使用指针模板参数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:28 26 4
gpt4 key购买 nike

我有以下代码:

struct Port {
int reg1;
int reg2;
};

#define PORT1 ((Port *) 0x00010000); // absolutely compile-time constants
#define PORT2 ((Port *) 0x00020000);

template <Port * port>
class PortWrapper {
public:
PortWrapper() {
port->reg1 = 1;
port->reg2 = 2;
}
};

constexpr static const Port * const port1c = PORT1;

int main(int argc, char* argv[]) {
PortWrapper<PORT1> port1; //Compiler says: error: could not convert template argument '65536u' to 'Port*'
PortWrapper<port1c> port1; //Compiler says: error: 'port1c' is not a valid template argument because 'port1c' is a variable, not the address of a variable
}

如何实例化这个模板?

我能做到:

Port port;
int main() {
PortWrapper<&port> port1;
}

但这不是我需要的。我需要将端口映射到预定义的常量地址。

最佳答案

你不能按原样,因为指针类型的非类型模板参数只能是空指针表达式或对象地址,而从整数转换不是这些。

您可以稍微重新设计模板:

template <uintptr_t portAddr>
class PortWrapper {
private:
static constexpr Port* port() { return (Port*)portAddr; }

public:
PortWrapper() {
port()->reg1 = 1;
port()->reg2 = 2;
}
};

请注意,在评论中,@KonradRudolph 质疑这是否严格遵守 constexpr 函数的规则,而且很可能没有。尽管如此,即使上面省略了 constexpr,任何体面的编译器都会内联 port() 的调用,从而有效地导致编译时评估。

关于c++ - 使用指针模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23675288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com