2010-03-07 45 views
7

是否可以通過重載參數的逗號來構造函數的可變參數?我希望看到一個例子,如何這樣做......,也許是這樣的:C++爲可變參數重載操作符逗號

template <typename T> class ArgList { 
public: 
    ArgList(const T& a); 
    ArgList<T>& operator,(const T& a,const T& b); 
} 
//declaration 
void myFunction(ArgList<int> list); 

//in use: 
myFunction(1,2,3,4); 

//or maybe: 
myFunction(ArgList<int>(1),2,3,4); 
+0

爲什麼你需要做的它使用逗號運算符?例如。 Boost.Assign已經給你一個整潔的語法,但它使用'operator()'。 – 2010-03-07 12:17:23

+0

,因爲我希望MyFunction(1,2,3)不是MyFunction(boost :: list_of(1)(2)(3))這樣簡單的用法。 – uray 2010-03-07 12:28:46

回答

11

這是排序 - 可能的,但用法看起來不會很好。對於exxample:

#include <vector> 
#include <iostream> 
#include <algorithm> 
#include <iterator> 

template <class T> 
class list_of 
{ 
    std::vector<T> data; 
public: 
    typedef typename std::vector<T>::const_iterator const_iterator; 
    const_iterator begin() const { return data.begin(); } 
    const_iterator end() const { return data.end(); } 

    list_of& operator, (const T& t) { 
     data.push_back(t); 
     return *this; 
    } 
}; 

void print(const list_of<int>& args) 
{ 
    std::copy(args.begin(), args.end(), std::ostream_iterator<int>(std::cout, " ")); 
} 

int main() 
{ 
    print((list_of<int>(), 1, 2, 3, 4, 5)); 
} 

這一缺點將被固定C++ 0x中,你可以這樣做:

void print(const std::initializer_list<int>& args) 
{ 
    std::copy(args.begin(), args.end(), std::ostream_iterator<int>(std::cout, " ")); 
} 

int main() 
{ 
    print({1, 2, 3, 4, 5}); 
} 

甚至混合類型:

template <class T> 
void print(const T& t) 
{ 
    std::cout << t; 
} 

template <class Arg1, class ...ArgN> 
void print(const Arg1& a1, const ArgN& ...an) 
{ 
    std::cout << a1 << ' '; 
    print(an...); 
} 


int main() 
{ 
    print(1, 2.4, 'u', "hello world"); 
} 
+0

這很酷,它在TR1? – uray 2010-03-07 11:47:59

+0

initializer_list?我不確定,因爲它需要語言的內置支持才能工作。但是這兩個代碼片段已經使用GCC 4.4.1編譯,std = C++ 0x – UncleBens 2010-03-07 11:52:29

+0

我們是否可以使用全局靜態重載運算符逗號,例如:'template T&operator,(const T&a,T & b);'? – uray 2010-03-07 11:56:32

1

運營商有一個固定的參數數目。你不能改變這一點。逗號運算符有兩個參數。所以不行。儘管如此,你可以推出一個自定義的級聯版本。

+0

逗號運算符有一個參數。 – StilesCrisis 2013-01-18 00:22:27

+0

@StilesCrisis逗號運算符實際上可以採用一個或兩個參數。使用兩個參數,您可以指定逗號可以出現在操作數之前和另一個類型之後。它比普通的一個逗號重載更不常見,這已經很少見了,但它是存在的。 – 2013-06-30 02:14:45

0

不,它不是。由逗號分隔符分隔的值列表將被評估爲單個值。例如:

1,2,3 

將導致一個值,3

+2

這就是我想要的,該函數仍然接收單個值,但該值是由操作符逗號構造的,我發現有可能做MyObject對象=(1,2,3),我認爲有可能將其修改爲使用MyObject作爲函數參數 – uray 2010-03-07 11:31:49

+0

@uray對不起,這是完全不清楚的。請修改您的問題以說明您想要做什麼。例如,示例代碼中的a,b,c和d的類型是什麼?請記住,您不能爲「內置」類型重載運算符。 – 2010-03-07 11:40:42

+0

@neil:我編輯了我的問題 – uray 2010-03-07 11:52:34

1

也許是這樣的:

class MyArgList { 
public: 
    typedef std::list<boost::any> ManyList; 

    template <typename T> 
    MyArgList& operator, (const T& val) { 
     elems.push_back(val); 
     return *this; 
    } 

    ManyList::iterator begin() {return elems.begin();} 
     ... 

private: 
    ManyList elems; 
}; 

用法是:

void foo(MyArgList& list); 
foo((myArgList(),1,2,3,4,5));