функция сравнения ассоциированного члена данных контейнера в классе - PullRequest
0 голосов
/ 06 мая 2009

У меня есть такой класс:

class MyClass{
public:
    MyClass(int Mode);
private:
    std::map < int, std::string, CompFunc > data;
};

Член данных должен использовать другую функцию сравнения в соответствии с аргументом Mode.

if Mode == 1, then use CompFunc1.
if Mode == 2, then use CompFunc2.
etc.

но аргумент шаблона CompFunc там исправлен, как я могу сделать это динамически?

спасибо.

Ответы [ 3 ]

4 голосов
/ 06 мая 2009
struct Cmp
{
    explicit Cmp(int mode) : mode_(mode) {}

    bool operator()(int lhs, int rhs) const
    {
        switch (mode_)
        {
            case 1: return CompFunc1(lhs, rhs); break;
            case 2: return CompFunc2(lhs, rhs); break;
            // etc.
        }
    }

private:
    int mode_;
};

class MyClass
{
public:
    explicit MyClass(int Mode) : cmp(mode), data(cmp) {}
private:
    Cmp cmp;
    std::map<int, std::string, Cmp> data;
};
1 голос
/ 06 мая 2009

Вы можете использовать тот же предикат сравнения, что и для карты.

class MyClass
{
    CompFunc cmp;
    map<int, std::string, CompFunc> data;
public:
    MyClass(int Mode) : cmp( get_cmpfunc(Mode) ), data(cmp) {...}
    bool operator == (...)
    {
        cmp(...);
    }
};
0 голосов
/ 06 мая 2009

Напишите класс / функцию-оболочку, которая соответствует правильному интерфейсу, но отправляет правильной функции в зависимости от режима (или других переменных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...