I N değerine bağlı olarak, farklı verir (bu durumda operatör(),) bir yöntem ile, bir şablonu sınıf D<N>
oluşturma (uzman işlevi farklı dönüş türleri sahip olduğunda)Kod çoğaltma ve şablon uzmanlık
sadece iki ayrı sınıf bildirimleri oluşturarak bu işi yapabilir, ancak bu kod tekrarına bir sürü pahasına geldi. Ben de içine ortak şeyler atmak için ortak bir temel sınıf yaratıp çalıştım ama ...
#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;
}
Nasıl yapıcı doğru devralmak için alamadım ve ne kadar deyimsel yanı olacağını bilmiyorum Kodumu daha iyi görüntüleyebilir miyim?
. Ya tutarlı bir polimorfik dönüş tipi yapın ya da her zaman temel bir tür döndürmek için mantıklı bir yol belirleyin. Böyle durumlarda genellikle uygulamanın temel ihtiyaçlarına geri dönmeyi faydalı buluyorum. – wallyk
Sorun, belirli bir uzunluktaki listeleri kodlamak için iyi bir tür olmamasıdır. Şablon kara büyüsünü yapmak, küçük DSL'imin kullanımı ve tip güvenliğini sağlamak için güzel olmasını sağlar. – hugomg
Yani bazı "derleme süresi uzunluğu" bağlantılı listesine ihtiyacınız var? Std :: array/boost :: dizisi sizin durumunuza uygun değil mi? Dezavantajı bir "subarray" nesnesini alamazsınız, ancak "çalışma zamanı değişken uzunluk arabirimini" de kullanabilirsiniz (yineleyiciler, [], işaretçi…). – ysdx