问题很简单。我有一个带有包含警卫的头文件和一个实现文件.impl。头文件包括实现文件。我想做以下事情:
标题文件:
template<size_t N>
class A
{
void func();
};
.impl文件:
template<size_t N>
typename std::enable_if<(N <= 5), void>::type A<N>::func() { ... }
template<size_t N>
typename std::enable_if<(N > 5), void>::type A<N>::func() { ... }
但是我对std::enable_if
还不错,似乎无法找到func
的原型,因为我通过更改返回类型来更改函数签名。如何为用户提供界面的一个功能,我可以有不同的实现。
这实际上是MCU寄存器修改器,它在两个寄存器上运行,因为一个寄存器没有容量。我宁愿不在函数内部使用任何基于N的脏偏移,而是依赖于简单的结构。另外,我宁愿不使用帮助函数,如果没有它们,可能会使事情变得复杂。
答案 0 :(得分:7)
您可以改为使用tag dispatching:
template <size_t N>
class A
{
void func()
{
do_func(std::integral_constant<bool, (N > 5)>{});
}
void do_func(std::true_type) { /* handles the N > 5 case */ }
void do_func(std::false_type) { /* handles the N <= 5 case */ }
};
答案 1 :(得分:3)
您可以委派:
#include <iostream>
template<std::size_t N>
class A
{
private:
template <std::size_t I>
typename std::enable_if<(I <= 5)>::type
f() { std::cout << "Small\n"; }
template <std::size_t I>
typename std::enable_if<(I > 5)>::type
f() { std::cout << "Big\n"; }
public:
void func() { f<N>(); }
};
int main()
{
A<1> small;
small.func();
A<10> big;
big.func();
}
如果您信任编译器优化:
template<std::size_t N>
class A
{
private:
void small() { std::cout << "Small\n"; }
void big() { std::cout << "Big\n"; }
public:
void func() {
if(N <= 5) small();
else big();
}
};