Дублирование кода и специализация шаблона (когда специализированная функция имеет разные типы возвращаемых значений)

Я создаю шаблонный класс D с методом (в данном случае operator ()), который возвращает разные типы в зависимости от значения N.

Я мог сделать только это работать, создавая два отдельных объявления классов, но это происходило за счет большого количества дублирования кода. Я также попытался создать общий базовый класс, в который можно было бы добавить общие вещи, но я не смог заставить конструктор наследовать правильно и не знаю, насколько это идиоматично ...

#include <cstdio>

template <int N>
struct D{
    int s;
    D(int x):s(x){}

    int yell(int x){
        printf("N=%d, %d\n", N, s+x);
        return s+x;
    }

    D<N-1> operator()(int x){
        D<N-1> d(yell(x));
        return d;
    }
};

template <>
struct D<1>{
    int s;
    D(int x): s(x){}

    int yell(int x){
        printf("N=%d, %d\n", 1, s+x);
        return s+x;
    }

    int operator()(int x){
        return yell(x);
    }
};


int main()
{
    D<2> f(42);
    printf("%d\n", f(1)(2));
    return 0;
}

Как я могу сделать свой код лучше выглядит?

7
задан hugomg 2 June 2011 в 21:01
поделиться