2013-12-23 33 views
0

一直在思考這些問題,但無法想出如何去做這件事。C++函數具有無限的可選參數和不同的輸入變量選擇

可以說,我有一個像功能:

double sum(int param1 , double param2 , [ optional... ]) 
{ 
    return param1 + param2; 
} 

現在我想

Q1:可選參數

Q2:可選參數的無限量,而不必聲明它們OFC。

Q3:使用int和double值的可選參數的

感謝提前:)

+6

[可變參數函數(http://en.cppreference.com/w/cpp/utility/variadic) – dasblinkenlight

回答

2

如果你熟悉的c++11,也引入了一種叫做variadic templates一個新的概念;這實質上允許創建像你所提到的那樣可以採取各種各樣的爭論的功能。

宣告這種函數的語法是這樣的:

template <typename ... Types> 
void someFunc(Types ...args) {} 

另一種選擇是使用std::initializer_list隨着std::accumulate實現這一點,因爲你已經知道的類型,您將要使用的變量。使用你的程序的一個例子是這樣的:

#include <iostream> 
#include <initializer_list> 
#include <numeric> 
using namespace std; 

double sum(initializer_list<double> vals) { 

    return accumulate(vals.begin(), vals.end(), 0.0); 
} 

int main() { 
    // your code goes here 
    cout << sum({2, 3, 4.6, 5, 6, 74.322, 1}) << endl; 
    return 0; 
} 
+2

這是最美麗的東西我在看到長時間。 – deW1

0

你想用Variadic function

顯示的一個例子很容易理解,它將計算任意數量參數的平均值。請注意,該函數不知道參數的數量或它們的類型。

#include <stdarg.h> 

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