2016-04-08 30 views
4

here'dan, std::function'un function_type veya eşdeğer bir üye türünün, onu başlatmak için kullanılan gerçek tipi dışa aktarması gerektiği görünmüyor.
result_type, argument_type, yanı sıra first_argument_type ve second_argument_type vardır, ancak yukarıda belirtilen türden hiçbir şey yoktur.
Neden böyle bir türü arayüzünün bir parçası olarak sunmuyor?
Elbette bunun için iyi bir neden var, ama nedenini anlayamıyorum, bu yüzden sadece onu bulmayı düşünüyorum. Ben ilk soru olacak biliyorumNeden std :: function işlev_türü veya eşdeğer üye türüne sahip değil?


niçin bunu, iyi, ben onların altında yatan tipleri öyle bir sfinae değerlendirme, aynı olup olmadığını kontrol etmek std::is_same<F1::function_type, F2::function_type>::value gibi bir şey yapmak istiyorum hayal gerekiyor İşaretler aynı olduğu sürece farklı işlevler içeriyorsa iyi olur.
Bunun çok anlamlı olmadığını itiraf ediyorum, dürüst olmak gerekirse soru sadece merak uğruna.

o

başlatmak için kullanılan gerçek türü ihracat:

his answer yorumlarında @Brian tarafından belirtildiği gibi

, ben yazarken başlatmak terimini kötüye DÜZENLEME

Neye ilgi duyduğum aslında şablon argümanıdır.
Örnek olarak, std::function<void(S&, int)> (S bir yapıdır), function_typevoid(S&, int) olur.

+1

'is_same' için, 'F1' ve' F2' aynı türde olup olmadığını kontrol edebilirsiniz, değil mi? – Brian

+0

@Brian evet, kesinlikle, yorumuma dikkat et * Çok mantıklı olmadığını itiraf ediyorum * !! :-) ... Sadece bunun için makul bir kullanım bulamamış olsam bile, fonksiyonun arayüzünün bir parçası olmadığı bir neden olup olmadığını merak ediyorum ve bu zaten iyi olurdu. cevap gerçekten. Emin değilim * işe yaramıyor * tek mantıklı cevap ya da başka sebepler varsa. Bu kadar. – skypjack

cevap

6

Sanırım yanlış soruyu soruyorsunuz. Doğru soru şu: Neden böyle bir üye tipi olmalı? Diyelim sen std::function herhangi uzmanlık kabul edebileceği bir işlev şablonu yazarsanız

ardından şablon parametresi zaten size hemen kullanılabilir olacaktır:

template <typename T> 
void f(std::function<T> F) { 
    // you wouldn't write decltype(F)::function_type here; you'd just write T 
} 

daha rahatsız edici durum biridir hangi İşte

template <typename Callable> 
void f(Callable C); 

gibi bazı işlev var, Callable bir std::function uzmanlaşma olduğunu garanti var, bu yüzden bile std::function<T> yo, typedef T function_type vardı keyfi bir çağrılabilir için Callable::function_type erişmek istemezsiniz. Yani burada herhangi bir kullanım olmaz.

Doğru soru şudur: Neden bazı standart kütüphane sınıfları şablon parametrelerini, örneğin T kapsayıcısını (typedef T value_type var) kapsıyor? Cevap, standardın, konteyner tiplerinin tatmin etmesi gereken belirli bir gereksinim setine sahip olması. Bu, bir tasarım amacını, farklı şablon kapları üzerinde çalışan jenerik algoritmaların yazılmasını mümkün kılacak tasarım şablonunu yansıtır. formun C<T>.Daha sonra, tüm kapların value_type ortaya çıkarılmasını zorunlu kılmak mantıklıdır çünkü bu, öğelerin türünü rasgele konteynırlardan ayıklamanın tek düzgün yoludur. std::function ayrıca bazı Callable kavramının bir örneği idi

Bir function_type typedef olduğunu, bu gereksinimi olması mantıklıdır böylece herhangi Callable fonksiyon tipini erişebilir kabul o kodu. Ancak durum bu değil ve sadece tek şablon std::function için olması yararlı değil.

3

Kolayca birini yazabilirsiniz: sizin terminoloji üzerinde

template < typename T > 
struct function_type; 

template < typename Sig > 
struct function_type<std::function<Sig>> { using type = Sig; }; 

: örneğini aradığınız kelime. Şablonun arası ile eşleştiğini yazın.

Neden üye olmadığınızı bilen tek kişi, bu özelliği tasarlayanlar ve (belki de) oy verenler. Kimsenin düşünemediği bir şey olabilirdi. Biraz apaçık görünüyor, ama bu, bunu isteme perspektifinden arkadan geliyor.

İlgili konular