2010-07-26 7 views
2

J'écris une classe qui sera utilisé pour effectuer des calculs sur un ensemble de valeurs, avec mise à l'échelle en fonction d'un poids par valeur. Les valeurs et les poids sont fournis au constructeur de la classe. La classe fera partie d'une bibliothèque interne, et donc je veux mettre aussi peu de restrictions que possible sur les structures de données des clients - certains clients utiliseront des vecteurs de structs ou std :: paires, une autre matrice OpenCV séparée. Au cours du développement, j'ai pris itérateurs début/fin et appuyé sur le mécanisme de couple (val = it->first, weight = it->second).Comment prendre des arguments de type fonction paire

Comment cela pourrait-il être mieux fait, sans trop de tracas pour le programmeur à l'autre bout? En général, qu'est-ce qui est considéré comme la meilleure pratique lorsqu'on a ce genre d'intrant multidimensionnel?

Répondre

4

itérateurs sont très bien. Cependant, en se fondant sur les types ayant appelé les membres du public first et second est une restriction assez grande.

En C++ 0x, l'accès aux membres std::pair sera unifié avec les modèles d'accès de std::tuple, via une fonction get. Cela vous permettra de surcharger et spécialisez la fonction get pour les types arbitraires:

#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); 
} 

Dans le cas où votre bibliothèque standard ne dispose pas get pour pair, puis la bibliothèque de tuple de boost semble avoir.

+0

Peut-être que je suis dense, mais je ne vois vraiment pas comment 'obtenir <0> (p)' et 'obtenir <1> (p)' sont une amélioration par rapport à 'p.first' et' p.second'. – sbi

+0

Parce qu'ils peuvent être implémentés pour n'importe quelle classe sans changer cette classe? Parce qu'ils font abstraction de la différence entre paire et tuple? Parce que vous n'avez pas besoin de connaître les chiffres en anglais? – UncleBens

+0

@UncleBens: Les deux dernières que je comprends (bien que je ne vois pas beaucoup d'avantage dans cela). Le premier je ne comprends pas. – sbi

0

Cette situation est à peu près ce que les modèles sont dans la langue.

Questions connexes