использование структуры timepec в multimap, где и / или как определить оператор - PullRequest
1 голос
/ 20 марта 2012

У меня есть какой-то унаследованный код, который выглядит примерно так. (Пожалуйста, держите смех ... Я ЗНАЮ, что это уродливо, даже после того, как я его псевдокодифицировал. Вот почему я пытаюсь улучшить его, и мое первое, над чем нужно работать - это голова с костью (по моему мнению) сохранение времени как двойной миллисекунды с начала эпохи и использование этого времени в качестве ключа в мультикарте). В любом случае, это код "before", назовите его foo.h:

#include <vector>
#include <map>
#include <list>
#include <queue>
#include <string>
#include <time.h>
using namespace std;

#include "yasper.h"
using yasper::ptr;

class foo
{
private:
    ...
public:
    foo(...);
    virtual ~foo();
    ...
bool operator() (const ptr<foo> poFoo1, const ptr<foo> poFoo2)
    {
        ...
    }
}
...
typedef ptr<foo> fooPtr;

typedef queue<fooPtr> fooQueue;
typedef list<fooPtr> fooList;
typedef fooList *fooListPtr;

typedef multimap<double, fooPtr> fooTimeMap;

Я также знаю, что моя платформа не обеспечивает точности по времени где-то около наносекунд, но она немного лучше, чем секунды или миллисекунды. Также я попытался понять и реализовать предложения из нескольких похожих вопросов, как из результатов Google, так и с этого сайта ( C ++. Использование .find () с ключом struct в карте и с использованием struct key на карте ). Однако они немного отличаются, потому что они для своей новой структуры, и я пытаюсь сделать это с помощью существующей стандартной структуры библиотеки.

Поэтому моя главная цель - изменить эту последнюю строку на:

typedef multimap<timespec, fooPtr> fooTimeMap;

Когда я делаю только это изменение, я получаю

В функции-члене 'bool std :: less <_Ty> :: operator () (const _Ty &, const _Ty &) const [with _Ty = timespec]': /.../include/cpp/xtree:895: создается из 'std :: _ Tree <_Traits> :: iterator std :: _ Tree <_Traits> :: find (постоянное имя типа _Traits :: key_type &) [with _Traits = std: : _Tmap_traits, std :: less, std :: allocator>>, true>] ' /home/.../foo.cpp:109: создается здесь /.../include/cpp/functional:136: ошибка: нет совпадения с оператором в поле _Left <_Right '</p>

Основываясь на этих и других ссылках, я попытался определить оператор меньше чем для timepec ... например, перед закрытием} класса foo я поставил

bool operator() (const timespec& lhs, const timespec& rhs)
{
    return ( lhs.tv_nsec < rhs.tv_nsec && lhs.tv_sec == rhs.tv_sec ) ||
        lhs.tv_sec < rhs.tv_sec;
}

но, думаю, я не понимаю, где это правильное место и почему. Или даже если это не «правильное место», а где-то достаточно допустимое, чтобы компилировать multimap<timespec,...> (и выполнить: -). Также в некоторых публикациях говорится об определении оператора <(...), а в других - об операторе () (...). </p>

Я бы предпочел не определять целый новый класс-обертку, такой как timespec_compare_class, вокруг timespec (я видел синтаксис multimap<timespec, fooPtr, timespec_compare_class> в других публикациях), поэтому я бы предпочел этого избегать, если есть способ сделать это в классе сам foo или даже после} foo, но все еще внутри foo.h.

(обратите внимание, я не думаю, что «оператор bool () (const ptr poFoo1, const ptr poFoo2)», ни fooQueue, fooList или fooListPtr имеют отношение к вопросу, но я оставил их в псевдо -код на всякий случай.)

Итак, кроме "чтения учебника по С ++", который, как я знаю, мне нужно сделать, кто-нибудь может подсказать мне более быстрое решение?

@ thb и @MarkRansom, спасибо, что ответили ... да, они были упомянуты и в других постах, хотя, как я сказал, немного другие случаи, например, с их собственными новыми структурами, которые я пытался применить к своему делу.

например. 1) Когда я делаю bool operator() (const timespec& lhs, const timespec& rhs) внутри {фигурных скобок} foo, я все равно получаю "ошибку: нет совпадения с оператором <в" _Left <_Right "" </p>

например. 2) когда я делаю это вне фигурных скобок, непосредственно перед multimap typedef, я получаю «bool operator () (const timespec &, const timespec &) 'должен быть нестатической функцией-членом».

например. 3) Когда я делаю bool operator< (const timespec& lhs, const timespec& rhs) внутри фигурных скобок, я получаю "bool foo :: operator <(const timespec &, const timespec &) 'должен принимать ровно один аргумент" И даже если я изменил это на один аргумент, я не думаю, это то, что я хочу, потому что я не пытаюсь объяснить, как сравнить foo с timepec. </p>

например. 4) Когда я делаю это вне фигурных скобок, непосредственно перед multimap typedef, я получаю «множественное определение оператора <(timespec const &, timespec const &) '". </p>

Так один из них ближе к правильному пути или что-то совершенно другое?

Ответы [ 2 ]

1 голос
/ 20 марта 2012

Почему бы не определить оператор меньше чем

bool operator< (const timespec& lhs, const timespec& rhs) { ... }

что немного отличается от того, что вы написали? Вызов функции operator () () действительно может использоваться вместо operator <(), </em>, но не совсем так, как вы это сделали. В любом случае, оператор <() </em>, вероятно, проще.

Удачи.

0 голосов
/ 20 марта 2012

Я бы изменил это немного больше:

struct TimeTest
{
    bool operator()(timespec const& lhs, timespec const& rhs) const
    {
         return <TEST>
    }
};
typedef multimap<timespec, fooPtr, TimeTest> fooTimeMap;

Причина, по которой я бы сделал дополнительный шаг, заключается в том, что если вы определили оператор <для timespec, то он имеет высокий шанс столкновения с любым C ++.библиотека, которая использует информацию о времени.Они могут не определять один и тот же порядок, и тогда все усложняется. </p>

При явной установке сравнения вы гарантируете, что столкновений не будет.

...