SORU
15 AĞUSTOS 2014, Cuma


Nasıl Boost ulaşmak için kullanılan C 14-stili otomatik dönüş türleri?

Birlikte iki değer katan bir fonksiyonu var sanırım. Eğer bu tür hakkında hiçbir şey bilmiyorum, o zaman ben temelde benim görevim iki kez yazmak; bir kere, dönüş türü belirleyicisi olarak gerçek bir dönüş değeri ve tekrar:

template <typename A, typename B>
auto Add(const A& a, const B& b) ->std::decay<decltype(a   b)>::type
{
  return a   b;
}

Bu işleri yaparken, okunması zor ve bakımı zor olduğu için istenmeyen bir davranıştır.

C 14 bu dönüş türü belirleyicisi (çürük olsa ne olacak emin değilim...) bırakabiliriz, çünkü bir sorun olmaz. Şimdilik C 11 saplanıp kaldım.

- Benim deneyim o zaman ben arayan bir özelliği C o olmadı henüz onun yol içine standart, ama orada olduğu bariz bir ihtiyaç, Boost library genellikle bir çözümü vardır. Belgeleri ile aradım ama bana yardımcı olabilecek bir şey bulamadım. BOOST_AUTO_RETURN BOOST_TYPEOF_TPL Daha fazla C 11 işlevselliği C 03 kullanıcılara yönelik gibi görünüyor.

Peşinde olduğum temel olarak aşağıdaki işlevleri gerçekleştiren bir şey

template <typename A, typename B>
auto Add(const A& a, const B& b)
{
  return a   b; // Deduce return type from this, like C  14 would
}

Beni -> decltype(...) her otomobil döndükten sonra açık tip vazgeçmek için izin verebilir farkında olmadığım (ya da C 11 numaran) işlevselliğini Artırmak için bazı kütüphane var mı? Bu nasıl hayata geçirilecek?

CEVAP
16 AĞUSTOS 2014, CUMARTESİ


C 11'de sadece Olası sonucuna işlevin dönüş türünü return lambda türüdür. C 11 Lambda kullanımı yine de kısıtlar. Bu gibi çalışır:

auto add = [](int a, int b) { return a   b; };

Bu geçerli ve int döndürür operator() üye işlev tanımlayan bir lambda add tanımlar. Lambda bir şey yakalamak değildir, çünkü bile yazabilirsiniz

auto add =  [](int a, int b) { return a   b; };

add düzenli yapın pointer-to-function: türü int(*)(int, int).

Ancak, C 11 izin vermez parametre türleri için belirtilen auto, ne için izin add tanımlanan bir şablon değişkeni, yani kullanamazsınız Bu anlamak için genel bir dönüş türü. Bu şablon bir sınıf sarmak için bir girişim başarısız:

template <typename A, typename B>
struct S { static auto add = [](A a, B b) { return a   b; }; }; // invalid

Geçersiz add sınıfının burada yeniden ve sen üyesi sınıf başlatıldığını sürece olamaz auto kullanın. Eğer işe yaradıysa ayrıca, A ya da neyin peşinde olduğunuzu daha fazla gibi görünüyor B düşüldükten izin vermedi.

Bu kısıtlamalar göz önüne alındığında, herhangi bir alternatif ama ifadeyi tekrar görmek istemiyorum. Önemsiz bir makro içinde tekrarı var, ama gizlemek olabilir.

#define AUTO_RETURN(func, ...) auto func -> decltype(__VA_ARGS__) { return __VA_ARGS__; }

template <typename A, typename B>
AUTO_RETURN(add(A a, B b), a   b)

Veya türevi Marc Glisse tarafından işaret

#define RETURNS(...) noexcept(noexcept(__VA_ARGS__)) -> decltype(__VA_ARGS__) { return __VA_ARGS__; }

template <typename A, typename B>
auto add(A a, B b) RETURNS(a   b)

biraz daha temiz görünüyor.

Zaten, bilmiyorum? bu tür bir şey olabilir. Ne olursa olsun, saçmalığında verilen Destek overkill görünüyor.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eric Magidson

    Eric Magidso

    4 Ocak 2009
  • kndx

    kndx

    11 Mart 2006
  • SVB International

    SVB Internat

    29 EKİM 2011