Тест на равенство типов с / decltype (), авто или RTTI в C ++?У Boost есть что-то для этого? - PullRequest
2 голосов
/ 10 августа 2010

Я пишу некоторый код для перевода типа C ++ в соответствующий тип для базы данных SQL.Я хочу определить тип, а затем в зависимости от того, что это такое, создать соответствующий код SQL.Я не уверен точно, что можно сделать в этом отношении, используя RTTI, auto или decltype.У меня есть некоторые идеи, но я не уверен, что они осуществимы.

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

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

или

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

или

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

или

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);

Похоже, что это будет работать, или у кого-нибудь есть совето том, как идти об этом?Заранее благодарим за любой вклад, который у вас может быть.

Ответы [ 3 ]

5 голосов
/ 10 августа 2010

Вы можете использовать простую функцию метапрограммирования, чтобы определить (во время компиляции), являются ли два типа одинаковыми:

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;
};

Действительно ли это помогает вам в вашей программе или нет, это другой вопрос.Я бы просто выбрал простое решение для перегрузки функций.

4 голосов
/ 10 августа 2010

Ваш последний вариант использования простой функции перегрузки должен работать нормально.

1 голос
/ 10 августа 2010

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

Перегруженные функции хорошо работают со статической типизацией.Используйте их.

...