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

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

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

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