Если я вас правильно понял, вы хотите карту для хранения указателя, который может быть использован для вызова функции члена на примере, значение выбирается из карту во время выполнения. Я собираюсь предположить, что это правильно, и что нет более простого способа решить ту же проблему. Довольно часто, когда вы попадаете в странные заводи C++, это признак того, что вам нужно снова взглянуть на проблему, о которой вы думаете, и посмотреть, является ли это единственным способом ее решения.
Проблема с использованием обычного указателя функции заключается в том, что нестатическая функция-член не является обычной функцией. Предположим, вы могли бы указать на функцию-член с обычным указателем на функцию, что произойдет, если вы разыменовали этот указатель и вызвали функцию? Функция-член нуждается в объекте для работы, и синтаксис не предоставляет способ передать этот объект.
Вам нужен указатель на элемент, который является слегка скрытой функцией с относительно сложным синтаксисом. В то время как обычный указатель абстрагирует объект, указатель на член реферат участника в классе; указатель указывает, какой член класса должен вызываться, но не тот объект, из которого требуется получить член (который будет указан при использовании указателя). Мы можем использовать это что-то вроде этого:
class B;
class A
{
B some_function()
{ /* ... */ }
};
B (A::* myval)() = A::some_function;
Здесь myval это переменная, которая указывает один из членов класса А, в этом случае some_function член (хотя это может указывать на какой-либо другой член того же тип). Мы можем передавать myval туда, где захотим (например, хранить его в контейнере STL, как в вашем примере), а затем, когда мы хотим вызвать функцию, мы указываем экземпляр, который должен быть вызван, чтобы найти функцию:
A some_a;
B newly_created_b = (some_a.*myval)();
Это работает для конкретного случая, но это не решит ваш общий вопрос, потому что указатели членов содержат класса они относятся как часть определения. То есть, две следующие переменные имеют совершенно разных типов:
B (Foo::* first_variable)() = Foo::some_function;
B (Bar::* second_variable)() = Bar::some_function;
Даже если обе функции могут производить B при вызове без аргументов, два значения работают на различных классов и, следовательно, вы не можете присвоить значение один тип к переменной другого типа. Это, конечно, исключает хранение этих разных типов в одном контейнере STL.
Если вы намерены хранить их в контейнере, вам нужно пойти с помощью основанного на функторе решения, такого как Charles Salvia.
Это помогло бы узнать, все ли функции, которые вы выполняете хотите позвонить, имеют одну и ту же подпись. Если да, то как они будут вызваны? Через некоторые * варианты * списки аргументов? –
Глядя на ваш предыдущий вопрос, где упоминаются макросы, мне напоминают библиотеки MFC и ATL. Они делают много таких вещей, когда каждый класс «регистрирует свои собственные методы» (путем включения макросов в объявление класса, которые расширяются до кода, который заполняет какую-то глобальную структуру данных). Это все так же безобразно, как грязь. – Eric
Действительно, то, что вы пытаетесь сделать, действительно неудобно в статически типизированном языке, поскольку указатели функций-членов для разных классов или разных сигнатур функций считаются принципиально разными типами. В C++ 'Foo :: bar (int x)' отличается от 'Foo :: baz (int x, int z)' как 'string' отличается от' float'. Что именно вы пытаетесь достичь? Должен быть лучший подход. –