Farklı tamsayı türlerinde farklı miktarlarda bit vardiyaları yapan bir işlev şablonuna ihtiyacım olduğunu varsayalım. Örneğin, n
girdi değeri char
türünde ise, işlev n>>2
ve n<<3
numaralı hesaplarda bazı hesaplamalar yapar. short int
ise, işlev n>>1
ve n<<8
kullanır. int
türü için n>>11
ve n<<9
vb. Tabii ki, bahsedilen değerler sadece örneklerdir ve bunlar arasında ve int_tip boyutu arasında bir korelasyon yoktur.Özelleştirilmiş bit kaydırma değerlerine sahip bir şablon nasıl oluşturulur
template <typename Num_Type = char, int s1 = 2, int s2 = 3> void test1(Num_Type &n)
{
// this is just an example code:
int a = n >> s1,
b = n << s2;
// do some calculations on a and b
}
Yani giriş değerinin farklı türleri için bu şablonu kullanabilirsiniz: Bu sorunun
Benim önerim böyle bir şey oldu. Ama derlediğimde, vardiyalı işlemlerde tanımlanmamış davranışlarla ilgili birkaç uyarı veriyor, çünkü değer çok büyük olabilir.
Yani soru iki şekilde sorulabilir:nasıl "tanımsız davranış" uyarıları almadan bit kaydırma işlemlerini özelleştirebilirsiniz? veya
0, 1, 2, ... , 31
0, 1, 2, ... , 31
: Belirtilen bir sayı aralığı olanintlength
gibi sınırlı bir veri türüne sahip olabilir miyim? Aptalca gelebilir, biliyorum, ama bu durumda bentemplate <typename Num_Type = char, intlength s1 = 2, intlength s2 = 3> void test1(Num_Type &n)
olarak şablon tanımlayabilir ve böylece derleyici kaydırma değerleri hakkında şikayetçi olmamalı.
Neden uyarıları alabilirim? Yani niçin n 'yi çok büyük bir s1' veya 's2' ile değiştirmeye çalışıyorsun? – rozina
@rozina Çok büyük değerlerle değiştirmeye çalışmıyorum, Amaçlanan değerlerim küçüktür, ancak vardiya miktarı int türünde olduğundan, derleyici çok büyük –
görebileceğimi düşünüyor. Belki de uyarı burada yararlı değildir ve bu işlev için devre dışı bırakabilirsiniz. Ve güvende olmak için 's1' ve s2''nün çok büyük olmadığını test etmek için işlev gövdesine ekler ekleyebilirsiniz. [Clang herhangi bir uyarı üretmez ama] (http://coliru.stacked-crooked.com/a/ad90bdc4aec37f1f) – rozina