模板大小递归 - 构造函数多次重载

时间:2015-06-27 03:41:55

标签: c++ templates recursion

我正在做一个练习(不是家庭作业;它是自我分配的),需要一个模板化的类,它通过函数调用一半大的类。当然,这意味着递归持续到一些基本情况(n == 1)。我遇到的问题是我还想编写一个基于F的构造函数,当n == 0时会导致“Multiple Overloads”(使用copy-constructor,为0/2 == 0)。 / p>

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的构造函数不起作用,因为我还剩下两个构造函数。

由于

2 个答案:

答案 0 :(得分:1)

您可以消除“重复构造函数”的歧义。通过添加未使用的参数

Foo(const Foo<n / 2>& x, int) {};

通过这种方式,n = 0,1的情况仍然与复制构造函数不同。

答案 1 :(得分:0)

我发现最好的解决方法是专门化整个结构/类

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;
};