2010-07-15 23 views
1

J'ai une fonction de modèle variadique:VARIADIC fonction C++ ne fonctionne pas lors de la récupération des arguments de type float

template<typename T, typename ArgType> 
vector<T> 
createVector(const int count, ...) 
{ 
    vector<T> values; 
    va_list vl; 
    va_start(vl, count); 
    for (int i=0; i < count; ++i) 
    { 
    T value = static_cast<T>(va_arg(vl, ArgType)); 
    values.push_back(value); 
    } 
    va_end(vl); 
    return values; 
} 

Cela fonctionne pour certains (pour moi, étrange) configurations de T et argtype, mais pas la manière Je pense:

// v1 = [0.0, 1.875, 0.0] 
vector<float> v1 = createVector<float, float>(3, 1.0f, 2.0f, 3.0f); 
// v2 = [0.0, 1.875, 0.0] 
vector<float> v2 = createVector<float, float>(3, 1.0, 2.0, 3.0); 
// v3 = [1.0, 2.0, 3.0] 
vector<float> v3 = createVector<float, double>(3, 1.0, 2.0, 3.0); 
// v4 = [1.0, 2.0, 3.0] 
vector<float> v4 = createVector<float, double>(3, 1.0f, 2.0f, 3.0f);  
// v5 = [1.0, 2.0, 3.0] 
vector<double> v5 = createVector<double, double>(3, 1.0, 2.0f, 3.0); 

Pourquoi ce travail quand argtype est double (même lors du passage des flotteurs), mais pas quand il est flotter?

Répondre

6

Les valeurs de virgule flottante sont transmises en tant que doubles lorsqu'elles sont transmises à des fonctions variadiques, tout comme les nombres entiers inférieurs à int sont passés en tant que int.

+0

+1 Intéressant, je n'ai jamais su cela. – fingerprint211b

+0

Les flotteurs sont-ils également passés en double? –

+0

@James: oui, les flotteurs sont passés en double. –