RTTI в функции, экспортированной из DLL - PullRequest
1 голос
/ 10 декабря 2010

У меня есть Visual Studio 2008 C ++ dll, где я хотел бы принять переменное число аргументов и знать тип каждого из них. Например:

 __declspec( dllexport ) void Foo( const char* object, const char* function, ... )
 {
    printf( "%s::%s( ", object, function );

    va_list list;
    va_start( list, function );

    while( va_arg( list, ??? ) )
    {
        printf( "[%s] %s ", type, value );
    }

    va_end( list );
    printf( " )\r\n" );
 }

Ожидаемое использование примерно так:

Buzz api;
int a = 1;
api.DoSomething( a, "hello", 0.2f );

Foo( "Buzz", "DoSomething", a, "hello", 0.2f );

Где ожидаемый результат будет выглядеть так:

Buzz::DoSomething( [int] 1, [const char*] "hello", [float] 0.2 )

Возможно ли это или что-то подобное с RTTI? Если решение с переменным аргументом невозможно (и я подозреваю, что это не так), я согласен с тем, что включает в себя несколько перегрузок для 1-n аргументов.

Спасибо, PaulH

Ответы [ 2 ]

1 голос
/ 10 декабря 2010

Первое: переменные функции в стиле "C" поддерживаются в C ++ для совместимости только с кодом C .Не рекомендуется использовать их в новом коде C ++, поскольку они не могут обеспечить безопасность типов.

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

Это так же верно в C ++, как и в C. Нет никакого способачтобы RTTI предоставил любую информацию о типе для произвольных значений в стеке.

Если все значения были указателями на объекты (экземпляры связанных классов) в иерархии классов, то вы могли бы использовать dynamic_cast для определения типов ..... но вы должны написать код для обработки различных классов самостоятельно, язык не сделает это за вас.

0 голосов
/ 10 декабря 2010

A Вариантное решение аргумента возможно, но не способом C и не в текущей версии языка.Если ваш компилятор реализует шаблоны переменных, вы можете сделать это с ними.Вы можете имитировать шаблоны с текущей версией до некоторого произвольного максимума (установленного переменной, если вы используете магию препроцессора), имея функцию с длинным списком аргументов по умолчанию.чтобы идти, вам нужно выучить вариационные шаблоны и / или препроцессор.Первое станет очевидным, как только вы проведете необходимое исследование.Последнее немного сложнее, но если вы посмотрите на src для таких вещей, как boost :: function, это станет очевидным.

...