2016-07-06 12 views
31

en böyle bir sınıf şablonu var diyelim edilir Bir derleyici ::close için bu bilgileri biliyor olabilir, çünkü <int(int)> atlamak için herhangi bir yolu var mı? Şablonun "tasarımını" kaydetmeye gerek yoktur.Kesintisi

Somut bir görev için, bir sınıfın şablonunu tasarlamalıyım. Bu sınıfa ait nesneler, bu işlev için inşaat zamanında bir işlev ve parametreler alabilir ve bu işlevi daha sonra çağırır.

cevap

35

Hayır, siz (şu anda) yapamazsınız.

template<typename F, typename... Args> 
A<std::decay_t<F>> make_A (F &&f, Args&&... args) { 
    return {std::forward<F>(f), std::forward<Args>(args)...}; 
} 

C++ 17 tam olarak ne istediğinizi yapmanızı sağlayacaktır template argument deduction for class tanıtacak: Bunu yapmanın standart yol "make_like" işlevini (örneğin make_pair, make_optional ...) oluşturmaktır. Sadece bir fabrika yazmak gerekir, Bundan önce

A a(::close, 1); 

: C++ 17'de yapıcıları için şablon parametre kesinti, benimsenmesine

+0

Bu fabrika işlevlerini yapmanın uygun yolunun 'std :: decay' veya 'A 'ile benzer bir özellik kullanması gerektiğine inanıyorum. Hangisini yaparsınız? A > '. Http://en.cppreference.com/w/cpp/utility/optional/make_optional veya diğer 'make_ * 'referansına bakın – KABoissonneault

+0

@KABoissonneault Evet doğru, evrensel referansları kullanırsam std :: decay' kullanmalıyım Cevabı güncelledim. – Holt

+0

Soruyu ve dolayısıyla cevabı tam olarak anlamadım. Bütün amaç, 'oto a (:: close, 1) 'demek mümkün mü? – Assimilater

11

Varsayılan değer olmadıkça, şablon sınıfının bağımsız değişkenlerini atlayamazsınız. Yapabilecekleriniz argümanı çıkaran ve bu argümanı şablon sınıfına ileten ve uygun örneklemin bir nesnesini döndüren bir yapım fonksiyonuna sahip olmaktır.

template<typename F, typename... Args> 
A<F> make_A(F f, Args&&... args) { 
    return A<F>(f, std::forward<Args>(args)...); 
} 
15

sayesinde, sadece yazmak mümkün olacak sizin için kesinti yapın:

template <class F, class... Args> 
A<std::decay_t<F>> make_a(F&& f, Args&&... args) { 
    return {std::forward<F>(f), std::forward<Args>(args)...}; 
} 

auto a = make_a(::close, 1); 

Bu biraz ayrıntılı olduğunu, ama en azından verimlilik konusunda endişelenmenize gerek yoktur - burada RVO sayesinde yapılan hiçbir kopya olacaktır.

+1

Re: C++ 17: Bu çok garip. En azından 'A a (:: close, 1); 'yazmalı. Yine de sanırım buna alışacağım. . . – ruakh

İlgili konular