C ++: использование строкового параметра, переданного для доступа к чему-либо в типе - PullRequest
0 голосов
/ 16 августа 2011

Моя цель - получить доступ к классу, который передается в качестве параметра внутри myFunction.

Вот что я пытаюсь сделать:

void myFunction(string myString)
{
   callFunctionOn(OuterType::InnerType::myString);
}

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

namespace OuterType {
namespace InnerType {
//stuff here
}
}

Однако использование myString таким способом не работает.Если myString содержит значение «class1», то я хочу, чтобы эта часть callFunctionOn интерпретировалась как

callFunctionOn(OuterType::InnerType::class1);

. Я чувствую, что это очень просто, но я программирую весь день, и мой ум устает...

РЕШЕНО: Похоже, что для этого мне нужен язык с отражением.Чтобы решить эту проблему, я использовал другой подход к проблеме и вместо этого передал указатель на класс.

Ответы [ 4 ]

6 голосов
/ 16 августа 2011

C ++ не имеет встроенного отражения, но имеет указатели на данные, функции и члены класса. Таким образом, вы можете использовать std::map или unordered_set, чтобы найти указатель с определенным именем (вы должны заранее добавить все пары имя / указатель на карту).

Ваше решение может выглядеть примерно так:

namespace Outer
{
    namespace Inner
    {
        void funcA( void ) { std::cout << "called funcA" << std::endl; }

        std::map< std::string, void (*)(void) > members;
    }
}

// in some initialization function
Outer::Inner::members["funcA"] = &Outer::Inner::funcA;


// later
std::string myString = "funcA";
void (*f)(void) = Outer::Inner::members[myString]; // lookup function by name
(*f)(); // call function via its pointer

Конечно, тип указателя, вероятно, потребуется изменить в соответствии с требованиями вашего приложения.

3 голосов
/ 16 августа 2011

Вы пытаетесь получить доступ к переменной на основе строки времени выполнения, содержащей ее имя? Это невозможно; имена переменных исчезают после компиляции и компоновки. (За исключением случаев, когда они хранятся для облегчения отладки).

0 голосов
/ 16 августа 2011

может быть, эта идея: operator () может принимать параметры, заключая его в класс ine, может делать вызовы, которые разрешаются в перегруженном operator () на основе его параметров.

    template<typename TypeSig, class InstanceOf, typename NA,typename Args>
class FuncMap {
    public:
        typedef TypeSig  (InstanceOf:: *cbMethod) ( NA, Args );

        FuncMap( InstanceOf & cInst, cbMethod cbM ) : mcInst(cInst) {mcbM = cbM;}

        TypeSig operator() ( NA na, Args args) {return (mcInst.*mcbM)(na, args);}
    private:
        InstanceOf & mcInst;
        cbMethod mcbM;
};

вам нужно построить карту строковых значений времени выполнения в виде ключей и указателей на методы экземпляра, как показано выше. я использовал это для повторной отправки трассировки и пользовательской отправки во время выполнения с меньшими издержками, чем RTTI.

это позволяет вам использовать значение по умолчанию, если ключ не найден, или другую логику по вашему желанию.

0 голосов
/ 16 августа 2011

Вы имеете в виду:

OuterType::InnerType::callFunctionOn(myString);
...