2016-04-12 36 views
0

operator>> istemcilerinin varolan bir nesneye başvurması gerekir. Yaptıkları şey, yerinde yapılan inşaat yerine değil, atamaktır.Atamadan ziyade bir yetkilendirme isteği alabilir miyim?

İlk inşaatı nasıl atlayabilirim? Belki de derleyici onu en iyi duruma getirebilir, ancak hala ihtiyacım olmayan parametreleri sağlamanız gerekebilir. Bu, herşeyle birlikte yapılabilir mi?

... Ben T, diyelim ki, sahip olabilmek için her türlü

template <typename T> void emplace_from(std::istream stream, T* place); 

işi istediğiniz stream >> my_t_variable işler için. Kuşkusuz, bu işlev beyanı biraz çirkin görünüyor.

+0

Standart özellikler AFAIK ile değil. Ulaşmak istediğiniz sözdizimine bir örnek verebilir misiniz? – Quentin

+0

@Quentin: Düzenlemeye bakın. – einpoklum

+0

Standart 'emplace' bir kurucu çağırır. Kurucu argümanlarını ona iletirsiniz ve bunları kurucuya yönlendirirsiniz. Önerilen 'imparatorluk' bir şey inşa edemez çünkü kurucu argümanlarını bir akımdan nasıl çıkaracağına dair hiçbir fikri yoktur. Kullanması gereken * yapıcı * bilgisi yoktur! –

cevap

2

Bu, ekstraksiyon operatörü (std::istream& operator>>(std::istream&, T&)) ile yapılamaz.

Genel olarak, std::istream ile. Basitçe, bir işlevi T extract(std::istream&) veya benzeri yerine uygulayın. Ekstraksiyon operatörüne hemen hemen aynı şekilde uygulanabilir: Karakter akışını oku, girişi kullanarak yeni bir nesneyi başlat, nesneyi döndür. Daha sonra sadece şu numarayı arayabilirsin: T t = extract(std::cin).

+0

"basitçe" ... eğer bunu uygularsam, hiç bir şeye ihtiyacım yok ... :-( – einpoklum

+1

@einpoklum Tam olarak seni takip etmiyorum Neden hiç bir şey yapmaya ihtiyacın yok? – user2079303

+0

istyonlar bir dizgiyi herhangi bir türe dönüştürmeme izin verir (birisinin operatörünü uygulamak için rahatsız olduğu >>) Bunlar olmadan, sadece bildiğim tipler için değil, sadece şablon türleri için de dönüşümler uygulamak zorundayım. Gelecekte herhangi bir zamanda – einpoklum

0
#include <experimental/optional> 

namespace exp = std::experimental; 

template<class T, class charT> 
exp::optional<T> extract(std::basic_istream<charT>& is) { 
    auto it = std::istream_iterator<T, charT>(is); 
    if (it != decltype(it)()) { 
     return *it; 
    } 
    return exp::optional<T>{}; 
} 

int main() 
{ 
    int i = *extract<int>(std::cin); 
    std::cout << i; 
} 
+0

Bu işlemin 'T' varsayılan olarak yapılandırılabilir olmasını gerektirdiğini unutmayın, bu yüzden '' durumunda olamayacağına inanıyorum. aslında, varsayılan olarak yapılandırılamaz. – user2079303

+0

@ user2079303 Ardından, bir istisna atmalı veya nullptr döndürmelidir. – 0x499602D2

İlgili konular