Тип тест за равенство с decltype(), auto или RTTI в C++? Boost има ли нещо за това?

Пиша някакъв код за превод на C++ тип в подходящ тип за SQL DB. Искам да идентифицирам типа и след това в зависимост от това какъв е, да създам подходящия SQL код. Не съм сигурен точно какво може да се направи в това отношение с помощта на RTTI, auto или decltype. Имам някои идеи, но не съм сигурен дали са приложими.

Например (знам, че следното може да не е валидно C++, просто се опитвам да предам идеята):

if (decltype(some_var) == int) { do_stuff(); }

or

if (decltype(some_var) == decltype(1) { do_stuff(); }

or

switch(decltype(some_var)) {
    case int:
        do_int_stuff();
        break;
    case string;
        do_string_stuff();
        break;
    case bool;
        do_bool_stuff();
        break;
}

or

string get_func_y(int var) {
    ...
    return my_string;
}

string get_func_y(string var) {
    ...
    return my_string;
}

string get_func_y(bool var) {
    ...
    return my_string;
}

...
string SQL = get_func_y(some_var);

Изглежда, че всичко това ще свърши работа или някой има ли съвет как да се справим с това? Благодарим предварително за всяка информация, която може да имате.


person Brett Rossier    schedule 10.08.2010    source източник


Отговори (3)


Можете да използвате проста функция за метапрограмиране, за да определите (по време на компилиране) дали два типа са еднакви:

template <typename T, typename U>
struct same_type 
{
   static const bool value = false;
};
template <typename T>
struct same_type< T, T >
{
   static const bool value = true;
};

Дали това наистина ви помага с вашата програма или не е друг въпрос. Просто бих избрал простото решение за претоварване на функциите.

person David Rodríguez - dribeas    schedule 10.08.2010
comment
Стандартната библиотека boost и C++0x трябва да го има (в type_traits: is_same) - person UncleBens; 10.08.2010
comment
Хм. Всъщност мисля, че това ще работи почти точно както исках. Изглежда, че if(is_same‹decltype(some_var), int›::value) { ... } ще работи. Не работи като част от превключвател, но следващото най-добро нещо. Бях почти сигурен, че претоварването на функциите ще работи, но исках нещо, което ще бъде самодокументирано и стегнато, що се отнася до кои типове се обработват. Благодаря. - person Brett Rossier; 10.08.2010

Последната ви опция за използване на просто претоварване на функции трябва да работи добре.

person Troubadour    schedule 10.08.2010
comment
Предполагах, че ще стане, но предпочитах другите, защото чувствах, че ще ми дадат по-добра самодокументация в кода. Исках да имам кратък списък на типовете, за които тествах, за да стане ясно с кои се работи. Просто така ми се стори по-интуитивно. Предполагам, че няма особено значение, тъй като тип, който не се обработва от претоварена функция, така или иначе трябва да предизвика грешка по време на компилиране. Благодаря. - person Brett Rossier; 10.08.2010

В C++ променливите и функциите имат статични типове. Единственото възможно объркване, различно от неправилното използване на кастинги, е дали указател към базов клас сочи към базов или към някакъв производен. Това означава, че вашите decltypes ще бъдат безполезни като условия (освен за извличане на клас), тъй като те ще имат постоянен отговор.

Претоварените функции работят добре със статично въвеждане. Използвай ги.

person David Thornley    schedule 10.08.2010
comment
Реших, че използването на decltype по този начин няма да работи, но е интересно да знам защо. Благодаря. - person Brett Rossier; 10.08.2010