我正在尝试并尝试创建一个接受两个列表的函数:一个浮点列表,一个整数列表。我的第一个方法就是:
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)
谢谢!
答案 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迭代器范围将允许您使用开始/结束对(前向范围概念)来装饰一对迭代器: