SORU
17 EYLÜL 2008, ÇARŞAMBA


Eğer bir sınıf belirli bir imza üye işlevi varsa kontrol edin

Şablon bir numara için ise bir sınıf belirli bir imza belirli bir üye işlevi varsa tespit etmek istiyorum.

Sorun burada bahsedilen benzer http://www.gotw.ca/gotw/071.htm ama aynı değil: Sutter'ın kitabın maddenin C sınıfı belirli bir imza ile bir üye fonksiyonu SAĞLAMAK ZORUNDA, yoksa program derlemek olmaz sorusuna cevap verdi. Benim sorunum ise, bir sınıf işlevi varsa, bir şeyler yapmam lazım, yoksa "başka bir şey".

Benzer bir sorun ile karşı karşıya boost::serileştirme ama ben öyle çözümü kabul ettiler: bir şablon işlevi çağırır varsayılan olarak ücretsiz bir fonksiyon (tanımlar) ile belirli bir sürece imza tanımladığınız belirli bir üye fonksiyon (kendi halinde "hale" bu da yaklaşık 2 parametreleri belirli bir türü) ile özel bir imza, başka bir derleme hata olur. Bu zorlayıcı ve zorlayıcı olmayan iki seri uygulamaktır.

Bu benim hoşuma gitmiyor çözüm için iki neden: 1) sigara müdahaleci geçersiz kılmak gerekir küresel "hale" işlev içinde boost::serileştirme ad, yani SENİN İSTEMCİ KODU açık artırma ad ve ad alanı seri hale getirme!! Ve ikinci olarak, geçerli bir sebepten dolayı, karışıklık 10-12 fonksiyon çağırma olduğunu, çünkü bir yığın çözmek için... ve bir oyun geliştiricisi değilim.

İhtiyacım tanımlamak için özel bir davranış için sınıflar var olmayan bir üye işlevi, ve benim varlıklardır içinde farklı bir ad (ve istemiyorum geçersiz kılmak için bir küresel işlev tanımlı bir ad, ben de bir tane)

Bana bu bulmacayı çözmek için bir ipucu verebilir misin?

EDİT: @Chris Jester-Genç İyi Koenig arama biliyorum. Aslında belgeleri (http://www.boost.org/doc/libs/1_36_0/libs/serialization/doc/index.html), onların yaptıklarını çok şaşırdım

neden açık artırma::seri hale getirme ad?

ama soruma cevap değil: boost aynı şeyi yapmak istemiyorum::seri hale getirme. Belki "bir şey olursa sınıfı olmayan varsa" bu imza ile çalışır. ben karar veririm ::boost Eğer o üye işlevi yok varsa YOKSA dünya çapında bir "hale" fonksiyonu... derleme hatası! geçersiz musun diye serileştirme Bunu istemiyorum.

EDİT: Tom Ley hatlarının @ Cevap beklediğim gibi değil üzgünüm. Bana ne tavsiye istediğim bir şey değil. Eğer okuduğunuz bağlantı gotw sitesi (eski site Herb Sutter olacaksın keşfetmek çözümün hem müdahaleci (ve istemiyorum) ve yok sorunu ile imza ve değil çözmek aslında ben kabul sınıfları yok o üye işlevi... biraz daha zor.

CEVAP
17 EYLÜL 2008, ÇARŞAMBA


Ben sizi doğru anlayıp anlamadığımdan emin değilim, ama SFİNAE derleme zamanı fonksiyonu olmadığını tespit etmek için istismar olabilir. Benim kod örneği (eğer sınıf üye işlevi size_t used_memory varsa testlerini sabit).

template<typename T>
struct HasUsedMemoryMethod
{
    template<typename U, size_t (U::*)() const> struct SFINAE {};
    template<typename U> static char Test(SFINAE<U, &U::used_memory>*);
    template<typename U> static int Test(...);
    static const bool Has = sizeof(Test<T>(0)) == sizeof(char);
};

template<typename TMap>
void ReportMemUsage(const TMap& m, std::true_type)
{
        // We may call used_memory() on m here.
}
template<typename TMap>
void ReportMemUsage(const TMap&, std::false_type)
{
}
template<typename TMap>
void ReportMemUsage(const TMap& m)
{
    ReportMemUsage(m, 
        std::integral_constant<bool, HasUsedMemoryMethod<TMap>::Has>());
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Neil Cicierega

    Neil Ciciere

    22 Mart 2006
  • Paul Schroder

    Paul Schrode

    30 Kasım 2007
  • TomSka

    TomSka

    30 Mayıs 2006