我正在做一个练习(不是家庭作业;它是自己分配的),需要一个模板化的类,该类用函数调用一半大的类。自然地,这意味着递归一直持续到某个基本情况(n==1)。我遇到的问题是,我还想写一个基于F的构造函数,当n=0时(使用复制构造函数,如0/2==0),这会导致"多个重载"。
template<size_t n>
struct Foo {
Foo() {};
Foo(const Foo<n / 2>& x) {};
Foo<n / 2> bar() {
Foo<n / 2> rtn;
if(n > 1) {
rtn.bar();
}
rtn.bar();
return rtn;
}
}
int main(int, char const**) {
Foo<4> a;
Foo<2> b = a.bar();
}
这附近有什么吗?为n==0专门化任何一个构造函数都不起作用,因为我还剩下两个构造函数。
感谢
您可以通过添加未使用的参数来消除"递归构造函数"的歧义
Foo(const Foo<n / 2>& x, int) {};
通过这种方式,n=0,1的情况仍然与复制构造函数不同。
我发现的最好的解决方案是专门化整个结构/类
template<size_t n>
struct Foo {
Foo() {};
Foo(const Foo& x) {};
Foo(const Foo<n / 2>& x) {}
Foo<n / 2> bar() const {
Foo<n / 2> rtn;
if(n > 1) {
rtn.bar();
}
return rtn;
};
double data[n];
};
template <>
struct Foo<0> {
Foo() {};
Foo(const Foo& x) {};
Foo bar() const {
Foo rtn;
return rtn;
};
double* data;
};