SORU
16 HAZİRAN 2010, ÇARŞAMBA


Nasıl C bir işlev adı için bir takma ad atamak mı ?

Kolay bir türü için yeni bir isim, bir değişken veya bir ad alanı oluşturabilirsiniz. Ama nasıl bir işlev için yeni bir ad atamak mı? Örneğin, adını kullanmak istiyorum printf holler. define açıktır... başka yol yok mu? #

Çözüm:

  1. #define holler printf
  2. void (*p)() = fn; //function pointer
  3. void (&r)() = fn; //function reference
  4. inline void g(){ f(); }

CEVAP
20 EYLÜL 2013, Cuma


Farklı yaklaşım vardır:

  • Olmayan aşırı yüklenmiş fonksiyonlar basitçe kullanabilirsiniz olmayan şablon: C 11

    const auto& new_fn_name = old_fn_name;
    
  • Bu işlev, birden çok aşırı varsa static_cast kullanmanız gerekir:

    const auto& new_fn_name = static_cast<OVERLOADED_FN_TYPE>(old_fn_name);
    

    Örnek: fonksiyon 2 aşırı std::stoi vardır

    int stoi (const string&, size_t*, int);
    int stoi (const wstring&, size_t*, int);
    

    Eğer ilk sürümü için bir isim yapmak istiyorsanız aşağıdaki kullanmanız gerekir:

    const auto& new_fn_name = static_cast<int(*)(const string&, size_t*, int)>(std::stoi);
    

    Not:tüm aşırı yüklenmiş versiyonları gibi bu işlevde diğer iş yapmak için bir yolu yoktur, her zaman istediğiniz belirtmeniz gerekir.

  • C 14 ile daha da constexpr şablon değişkenleri ile gidebilirsiniz. Bu şablonu esas alan diğer işlevleri sağlar:

    template<typename T>
    constexpr void old_function(/* args */);
    
    template<typename T>
    constexpr auto alias_to_old = old_function<T>;
    
  • Ayrıca, bir işlevi var C 11 ile başlayan diğer üye işlevleri sağlar std::mem_fn denir. Bakın aşağıdaki örnek:

    struct A {
       void f(int i) {
          std::cout << "Argument: " << i << '\n';
       }
    };
    
    
    A a;
    
    auto greet = std::mem_fn(&A::f); // alias to member function
    // prints "Argument: 5"
    greet(a, 5); // you should provide an object each time you use this alias
    
    // if you want to bind an object permanently use `std::bind`
    greet_a = std::bind(greet, a, std::placeholders::_1);
    greet_a(3); // equivalent to greet(a, 3) => a.f(3);
    

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Caramella Girls

    Caramella Gi

    19 Mayıs 2008
  • Joshua Benedict

    Joshua Bened

    26 EKİM 2013
  • Stevie

    Stevie

    2 Mayıs 2010