Функция Variadic C ++ не работает при извлечении аргументов типа float - PullRequest
1 голос
/ 15 июля 2010

У меня есть функция шаблона variadic:

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;
}

Это работает для некоторых (для меня странных) конфигураций T и ArgType, но не так, как я ожидаю:

// 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);  

Почему это работает, когда ArgType удваивается (даже при прохождении с плавающей точкой), но не когда он с плавающей точкой?

1 Ответ

6 голосов
/ 15 июля 2010

Значения с плавающей запятой передаются как двойные при передаче в функции с переменным числом, так же как целые числа, меньшие int, передаются как int.

...