2010-03-07 25 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));