2016-04-10 3 views
1

Я смотрел видео на Youtube, которое представляло различные функции нового стандарта (C++ 11, C++ 14).Функция sum с параметром списка C++ 11/C++ 14 style

Я знаю, что в C была возможность создать VARIADIC функции, такие как, что:

#include <stdarg.h> 
#include <stdio.h> 

double average(int count, ...) 
{ 
    va_list ap; 
    int j; 
    double sum = 0; 

    va_start(ap, count); /* Requires the last fixed parameter (to get the address) */ 
    for (j = 0; j < count; j++) { 
     sum += va_arg(ap, int); /* Increments ap to the next argument. */ 
    } 
    va_end(ap); 

    return sum/count; 
} 

int main(int argc, char const *argv[]) 
{ 
    printf("%f\n", average(3, 1, 2, 3)); 
    return 0; 
} 

видео показывает следующий пример:

struct Sum 
{ 
    template <typename T> 
    static T sum(T n) 
    { 
     return n; 
    } 

    template <typename T, typename... Args> 
    static auto sum(T n, Args ... rest) -> decltype(n + sum(rest...)) 
    { 
     return n + sum(rest...); 
    } 
}; 

Я использую вторую кучу кода подобного :

int main() 
{ 

    int suma = Sum::sum(1, 2, 3, 4, 5, 6); 
    cout << suma; 

    return 0; 
} 

И я нашел его полностью работоспособным, так что это действительно здорово. Но я получил предупреждение:

(активный) не экземпляр перегруженной функции «Sum :: суммы» не соответствует списку аргументов

Моего вопрос: Какой подход лучше, и как я могу избавиться от предупреждения во втором?

+0

Какой компилятор вы с помощью? – HolyBlackCat

+0

Я использую компилятор, который построен в Visual Studio 2015, я пытался проверить, что такое версия компилятора, но я не могу найти, где она написана. – FieryCod

+0

Я не думаю, что вариационная функция хороша, потому что она не безопасна для типов и, следовательно, подвержена тонким ошибкам. Это может быть хорошим примером того, как кодировать вариационные функции, но более надежный подход состоял бы в том, чтобы передать массив, т. Е. «Double avg (const int a [], size_t n)». Эта подпись также соответствует тому, как данные обычно представлены в C. Если вы используете C++, используйте возможности шаблона C++. –

ответ

2

Первый метод для C, второй метод - для C++ с проверкой типа.

Чтобы исправить код в C++ 14, удалить задний возвращаемый тип: Demo

C++ 1z позволяет даже складное выражение:

template <typename ... Ts> 
static auto sum(Ts...args) 
{ 
    return (0 + ... + args); 
} 

Demo

+0

@Charlie: добавить исправление для C++ 14 после редактирования. – Jarod42

+0

Первое демо работает отлично. Большое спасибо. Но второй не работает на NetBeans 8.0 с включенным новым стандартом. – FieryCod

Смежные вопросы