【发布时间】:2014-07-18 20:04:15
【问题描述】:
#include <iostream>
template< class T, unsigned S >
struct my_iterator;
template< class T >
struct my_iterator< T, 1 >
{
T* p;
};
template< class T, unsigned S >
struct my_iterator : my_iterator< T, S / 2 >
{
static_assert ((S & (S - 1)) == 0, "S must be a power of 2");
using my_iterator< T, S / 2 >::p;
unsigned burp() {return (*p) + S;}
};
int main()
{
int v = 10;
my_iterator< int, 8 > a;
a.p = &v;
std::cout << a.burp() << std::endl;
my_iterator< int, 4 >& b = a;
std::cout << b.burp() << std::endl;
my_iterator< int, 1 > c;
c.p = &v;
std::cout << c.burp() << std::endl; // error: no member named 'burp'
return 0;
}
这将修复错误:
template< class T >
struct my_iterator< T, 1 >
{
unsigned burp() {return (*p) + 1;}
T* p;
};
但在我的真实代码中,我有很多方法,不仅仅是burp,它们都依赖于S 和p,它们都需要实现两次,一次在通用类中,一次在专业类中。有什么办法可以避免重复代码?我看到了这个类似的问题:
Avoiding code duplication in a specialized template
但答案在我的情况下不起作用,因为我最终会得到许多 p 的副本,在递归层次结构的每一层都有一个。
【问题讨论】: