2010-07-26 2 views
2

Я пишу класс, который будет использоваться для выполнения некоторых вычислений по набору значений с масштабированием, основанным на весу для каждого значения. Значения и веса поставляются в конструктор класса. Класс будет частью внутренней библиотеки, поэтому я хочу установить как можно меньше ограничений на структуры данных клиентов - некоторые клиенты будут использовать векторы structs или std :: pairs, а также другие отдельные матрицы OpenCV. Во время разработки я принимал итераторы старта/конца и полагался на парный механизм (val = it->first, weight = it->second).Как принять аргументы функции типа пары

Как это можно сделать лучше, без лишних хлопот для программиста на другом конце? Как правило, что считается наилучшей практикой при наличии такого рода многомерного ввода?

ответ

4

Итераторы в порядке. Однако, полагаясь на типы, имеющие публичных членов, которые называются first и second, это довольно большое ограничение.

В C++ 0x доступ к членам std::pair будет унифицирован с шаблонами доступа std::tuple через функцию get. Это позволит вам перегружать и специализировать функцию ПОЛУЧИТЬ для любых типов:

#include <iostream> 
#include <utility> 

template <class T> 
void print(const T& data) 
{ 
    using std::get; 
    std::cout << get<0>(data) << ' ' << get<1>(data) << '\n'; 
} 

struct Coord 
{ 
    int x, y; 
}; 

template <unsigned> 
int get(const Coord&); 

template <> 
int get<0>(const Coord& c) { return c.x; } 

template <> 
int get<1>(const Coord& c) { return c.y; } 

int main() 
{ 
    print(std::make_pair(1, 2)); 
    Coord coord = {4, 5}; 
    print(coord); 
} 

В случае, если ваша стандартная библиотека не get для pair, то библиотека кортежей, кажется, поднимать торг иметь.

+0

Возможно, я плотный, но я действительно не понимаю, как 'get <0> (p)' и 'get <1> (p)' являются улучшением по сравнению с 'p.first' и' p.second'. – sbi

+0

Потому что они могут быть реализованы для любого класса без изменения этого класса? Потому что они абстрагируют разницу между парой и кортежем? Потому что вам не нужно знать английские цифры? – UncleBens

+0

@UncleBens: Последние два я понимаю (хотя я не вижу в этом большого преимущества). Первого я не получу. – sbi

0

Эта ситуация в значительной степени зависит от шаблонов.

Смежные вопросы