C ++ 11'de, işlev bildirimi için iki sözdizimi vardır:
dönüş tipi tanımlayıcı (
argüman beyanları ... )
ve
auto
tanımlayıcı (
bağımsız değişken-bildirimler ... )
->
dönüş_türü
Bunlar eşdeğerdir. Şimdi eşdeğer olduklarında, neden ikincisini kullanmak istiyorsunuz? C ++ 11 decltype
, bir ifadenin türünü tanımlamanıza izin veren bu harika şeyi tanıttı . Dolayısıyla, dönüş türünü bağımsız değişken türlerinden türetmek isteyebilirsiniz. Yani dene:
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
ve derleyici bu ne bilmiyor söyleyecektir a
ve b
içindedir decltype
argüman. Bunun nedeni, yalnızca argüman listesi tarafından bildirilmeleridir.
Daha declval
önce bildirilmiş olan şablon parametrelerini kullanarak sorunu kolayca çözebilirsiniz . Sevmek:
template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);
şu anda gerçekten ayrıntılı hale gelmesi dışında. Böylece alternatif bildirim sözdizimi önerildi ve uygulandı ve şimdi yazabilirsiniz
template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);
ve daha az ayrıntılı ve kapsam kurallarının değişmesi gerekmiyordu.
C ++ 14 güncellemesi: C ++ 14 ayrıca yalnızca
auto
tanımlayıcı (
argüman beyanları ... )
işlev kullanımdan önce tam olarak tanımlandığı ve tüm return
ifadeler aynı tipte olduğu sürece . ->
Eğer kaynak dosyada vücudu gizlemek istiyorsanız sözdizimi (başlığında bildirilmiş) Kamu fonksiyonlar için faydalıdır kalır. Açıkça bu, şablonlarla yapılamaz, ancak başka türlü yazılması zor olan bazı somut türler (genellikle şablon meta programlaması yoluyla türetilir) vardır.