SORU
1 Kasım 2009, Pazar


C bağımsız değişken sayısı ?

Nasıl bağımsız değişken bir dizi kabul eden bir fonksiyon yazabilirim? Bu mümkün, nasıl mı?

CEVAP
2 Mayıs 2013, PERŞEMBE


C 11iki yeni seçenek, Variadic functions referans sayfası olarak varAlternatifler bölümBirleşik Devletleri:

  • Variadic şablonları da sayısı değişkeni olmayan fonksiyonların oluşturmak için kullanılabilir argümanlar. Kısıtlamalar empoze etmezler, çünkü genellikle daha iyi bir seçimdir bağımsız değişken türleri, tamsayı ve kayan nokta gerçekleştirmez promosyonlar ve tip güvenli. (C 11)
  • Eğer bağımsız değişken ortak bir türü paylaşmak, bir std::initializer_list sağlar bağımsız değişken erişmek için uygun bir mekanizma (farklı bir sözdizimi ile de olsa).

Aşağıda bir örnek her iki seçeneği görünürsee it live):

#include <iostream>
#include <string>
#include <initializer_list>

template <typename T>
void func(T t) 
{
    std::cout << t << std::endl ;
}

template<typename T, typename... Args>
void func(T t, Args... args) // recursive variadic function
{
    std::cout << t <<std::endl ;

    func(args...) ;
}

template <class T>
void func2( std::initializer_list<T> list )
{
    for( auto elem : list )
    {
        std::cout << elem << std::endl ;
    }
}

int main()
{
    std::string
        str1( "Hello" ),
        str2( "world" );

    func(1,2.5,'a',str1);

    func2( {10, 20, 30, 40 }) ;
    func2( {str1, str2 } ) ;
} 

gcc clang kullanıyorsanız PRETTY_FUNCTION magic variable neler olduğunu anlamada yardımcı olabilir hangi işlevin türü imzası görüntülemek için kullanabiliriz. Örneğin kullanarak:

std::cout << __PRETTY_FUNCTION__ << ": " << t <<std::endl ;

sonuçlar örnekte variadic fonksiyonlar için aşağıdaki int (see it live):

void func(T, Args...) [T = int, Args = <double, char, std::basic_string<char>>]: 1
void func(T, Args...) [T = double, Args = <char, std::basic_string<char>>]: 2.5
void func(T, Args...) [T = char, Args = <std::basic_string<char>>]: a
void func(T) [T = std::basic_string<char>]: Hello

Visual Studio FUNCSIG kullanabilirsiniz.

Güncelleme Öncesi C 11

PreC 11std::initializer_list alternatif std::vector standard containers diğer: biri olurdu

#include <iostream>
#include <string>
#include <vector>

template <class T>
void func1( std::vector<T> vec )
{
    for( typename std::vector<T>::iterator iter = vec.begin();  iter != vec.end();   iter )
    {
        std::cout << *iter << std::endl ;
    }
}

int main()
{
    int arr1[] = {10, 20, 30, 40} ;
    std::string arr2[] = { "hello", "world" } ; 
    std::vector<int> v1( arr1, arr1 4 ) ;
    std::vector<std::string> v2( arr2, arr2 2 ) ;

    func1( v1 ) ;
    func1( v2 ) ;
}

ve alternatifvariadic şablonlarıonlar olmasa da variadic functions olurdutip-güvenlive genel olarak error prone and can be unsafe to use ama sadece diğer potansiyel alternatif kullanmak olacaktırvarsayılan bağımsız değişkenleribu Sınırlı kullanımı olmasına rağmen. Aşağıdaki örnek, bağlantılı referans örnek kod modifiye edilmiş bir versiyonu

#include <iostream>
#include <string>
#include <cstdarg>

void simple_printf(const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);

    while (*fmt != '\0') {
        if (*fmt == 'd') {
            int i = va_arg(args, int);
            std::cout << i << '\n';
        } else if (*fmt == 's') {
            char * s = va_arg(args, char*);
            std::cout << s << '\n';
        }
          fmt;
    }

    va_end(args);
}


int main()
{
    std::string
        str1( "Hello" ),
        str2( "world" );

    simple_printf("dddd", 10, 20, 30, 40 );
    simple_printf("ss", str1.c_str(), str2.c_str() ); 

    return 0 ;
} 

Kullanarakvariadic fonksiyonlarayrıca iletebilirsiniz draft C standard bölümünde 5.2.2 detaylı olan bağımsız kısıtlamalar ile birlikte gelirİşlev çağrısıparagraf7:

Belirli bir değişkeni parametre yok, argüman alan fonksiyon va_arg (yüzde 18,7) çağırarak bağımsız değişken değeri elde edebilirsiniz böyle bir şekilde geçti. Lvalue-rvalue (4.1)-işaretçi dizi (4.2) ve işlev işaretçisi (4.3) standart değişken dönüşüm ifadesi kullanılmaktadır. Eğer argüman aritmetik, numaralandırma, işaretçi, işaretçi üyesine veya sınıf türü var mı yoksa bu dönüşümlerden sonra, program kötü oluşur. Eğer argüman non-POD sınıf türü (Madde 9), davranış tanımsızdır. [...]

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bogdan Gabriel

    Bogdan Gabri

    5 Aralık 2006
  • metagamers

    metagamers

    13 Mayıs 2006
  • tseyina

    tseyina

    2 AĞUSTOS 2006