Ne yazık ki, en önemsiz olanı bile olan constexpr
işlevinin kesinlikle gerekli olmadıkça derleyici tarafından değerlendirileceğinin bir yolu yoktur. Yani, derleme zamanında değerinin gerekli olduğu bir yerde görünmediği sürece, örn. bir şablonda. derleme sırasında değerlendirme yapmak için derleyici zorlamak için, aşağıdakileri yapabilirsiniz: o zaman
constexpr int foo_implementation (int x) {
return x + 1;
}
#define foo(x) std::integral_constant<int, foo_implementation(x)>::value
ve her zamanki
olarak kodunuzda
foo
kullanmak
int f = foo(123);
bu yaklaşımının iyi olduğunu o derleme zamanı değerlendirme garanti ve foo
bir çalışma zamanı değişken geçmek eğer bir derleme hatası alırsınız:
int a = 2;
int f = foo(a); /* Error: invalid template argument for 'std::integral_constant',
expected compile-time constant expression */
o kadar iyi bir şey, bir makro gerektirmesidir, ancak hem garantili derleme zamanı değerlendirmesi hem de güzel kodlar istiyorsanız, bu durum kaçınılmaz görünmektedir. (Olsa da yanıltılmayı çok isterim!)
Her zaman bir işlev şablonuna dönüştürebilirsiniz: 'template int foo() {return x + 1; } ' –
' Constexpr', burada yanıtlarda göreceğiniz tüm sözdizimsel çözümlere karşı koymak için kısmen çağrıldığını unutmayın. – rubenvb
'#define foo (N) foo()' Bana uygun görünüyor. –