一个模板函数,可以接受任何类型的两个列表

时间:2013-12-31 07:54:00

标签: c++ c++11 initializer-list

我正在尝试并尝试创建一个接受两个列表的函数:一个浮点列表,一个整数列表。我的第一个方法就是:

template<typename FloatIterator, typename IntIterator>
Thing *createThing(
   FloatIterator floatsBegin,
   FloatIterator floatsEnd,
   IntIterator intsBegin,
   IntIterator intsEnd
) {
   ...
}

这适用于各种容器,甚至是普通的指针。但是,我无法轻松传入std :: initializer_list。例如,我希望能够像这样调用函数:

Thing *thing = createThing({ 3.0, 4.0, 5.0 }, { 0, 1, 2, 2, 3, 0 });

所以我在想,我会尝试这样的事情:

template<typename FloatContainer, typename IntContainer>
Thing *createThing(const FloatContainer &floats, const IntContainer &ints) {
    for (float f : floats) { ... }
    for (int i : ints) { ... }
}

这适用于stl容器和initializer_lists,但它不再适用于简单的指针。我不能再这样做了:

int numFloats;
float *floats = readFloatsFromFile(&numFloats, "myfloats.txt");

int numInts;
int *ints = readIntsFromFile(&numInts, "myints.txt");

Thing *thing = createThing(floats, floats + numFloats, ints, ints + numInts);

所以我的问题:有没有办法编写一个可以接受所有三种输入的函数? (指针,stl容器和initializer_lists)

谢谢!

2 个答案:

答案 0 :(得分:2)

我甚至不会尝试统一这两个功能。 即使模板参数的数量相同,每个函数也会使用不同数量的参数。因此,有两个功能和前进:

template<typename FloatIterator, typename IntIterator>
Thing *createThing(
   FloatIterator floatsBegin,
   FloatIterator floatsEnd,
   IntIterator intsBegin,
   IntIterator intsEnd
) {
   ...
}

template<typename FloatContainer, typename IntContainer>
inline Thing *createThing(const FloatContainer &floats, const IntContainer &ints) {
    return createThing(FloatContainer.begin(), ...);
}

答案 1 :(得分:1)

Boost迭代器范围将允许您使用开始/结束对(前向范围概念)来装饰一对迭代器:

http://www.boost.org/doc/libs/1_55_0/libs/range/doc/html/range/reference/utilities/iterator_range.html