указатели на функции-члены с boost :: option - PullRequest
0 голосов
/ 07 декабря 2011

Я пытаюсь определить «универсальный» указатель на функцию-член, которую можно использовать для доступа к различным функциям-членам в определенном классе, следующим образом:

class Security{
    inline std::vector<double> member_function(const std::string &input_data_string){ return ... a vector<double>....;};
    };

Я определяю универсальный указатель на функцию-член, которую можно использовать для доступа к функциям «OTHER», а также с разными типами возвращаемых значений и параметрами разных типов, используя boost :: variable.

typedef boost::variant<std::string,double, std::vector<double>, std::vector<std::string>>  (Security::*ptr_sec_fn)(boost::variant<std::string,double, std::vector<double>, std::vector<std::string>> );

Затем присвоение указателя функции-члену

    ptr_sec_fn=&Security::member_function;

Это ошибка, которую я получаю:

cannot convert from 'std::vector<_Ty> (__thiscall Security::* )(const std::string &)' to 'boost::variant<T0_,T1,T2,T3> (__thiscall Security::* )(boost::variant<T0_,T1,T2,T3>)'
1>          with
1>          [
1>              _Ty=double
1>          ]
1>          and
1>          [
1>              T0_=std::string,
1>              T1=double,
1>              T2=std::vector<double>,
1>              T3=std::vector<std::string>
1>          ]
1>          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

Не могли бы вы помочь мне определить, что я делаю здесь неправильно? Большое вам спасибо.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2011

Тип Security::member_function равен std::vector<Ty> (_thiscall Security::* )(const std::string &), что полностью отличается от типа указателя, которому вы пытаетесь присвоить его.Это не разрешеноВы можете назначать только функции-члены, которые принимают и возвращают этот вариант указателю на функцию-член этого типа.

Если это назначение сработало, то код, пытающийся вызвать указатель на функцию-член, передаст вариант функции ифункция будет нарушена, потому что она ожидает строку.Никому не хватает информации, чтобы знать, что кому-то нужно каким-то образом получить строку из вашего варианта.И даже если все это сработало, когда функция возвращает вектор, кто-то должен знать, что вектор должен использоваться для создания варианта.Это должно быть сделано на сайте вызовов, но сайт вызовов даже не знает, что вектор возвращается.Тот факт, что вы знаете, какой тип возвращается, недостаточно, компилятор должен это знать.И тот факт, что вы знаете тип, указывает на то, что вы не должны использовать универсальный тип.Вы должны просто использовать правильный тип.

Если у вас есть куча перегруженных функций, которые принимают и возвращают разные типы, вы не сможете иметь один указатель на функцию-член, который может указывать на любой изэти перегрузки.Попытка сделать это просто полностью игнорирует безопасность типов в C ++.Поэтому вам нужно будет придумать безопасный способ сделать то, что вы хотите.

Нам понадобится больше информации о том, какова ваша цель, чтобы помочь вам найти способ сделать это, но что выв настоящее время попытки никогда не сработают.

0 голосов
/ 07 декабря 2011

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

С другой стороны, вы все равно можете переосмыслить свой дизайн.Зачем вам нужен такой универсальный указатель на функцию в любом случае?Можно ли конкретизировать это?Хороший дизайн проявляется в четких типах, потому что типы показывают программисту более точно, какие данные требуются, чем любая документация.

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