【发布时间】:2017-07-13 07:41:30
【问题描述】:
我想专门化一个模板类的成员方法。此模板类有一个 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++ 俚语中,我想做什么的正确词语和术语是什么?
【问题讨论】:
-
template<int INSTANCE> void mailbox<INSTANCE>::write(uint32_t v) -
你确实知道如何定义模板类的成员函数吗?在非工作示例中,
mailbox和::之间是否缺少某些内容? -
如果您当然可以使用 17,我建议您阅读 C++17 的
constexpr if。这应该可以解决您的问题。 -
我添加了一个用户代码示例,即使请求的版本也不会改变。
-
@MarošBeťko Normal
if如果定义语法正确,在这里可以正常工作。if constexpr将通过确保 false 分支不会生成无法访问的代码来帮助优化,否则不会提供语义差异。
标签: c++ templates template-specialization