Черты С++ для параметров функции, не являющейся шаблоном?

При определении шаблона функции экземпляры параметров шаблона, как правило, неизвестны. Признаки типа можно использовать для получения некоторой информации во время компиляции. Например, вот тривиальное применение is_pointer:

template <typename T>
void foo(T p) { cout << is_pointer<T>::value << endl; }

У меня такой вопрос: бывает ли когда-нибудь ситуация в не шаблонной функции, когда функции времени компиляции, подобные трейтам, могут предоставить полезную информацию?


person user2023370    schedule 27.02.2012    source источник
comment
Что бы вы хотели знать о типе, который вы уже знаете?   -  person perreal    schedule 28.02.2012
comment
@perreal: смотри мой ответ.   -  person Oliver Charlesworth    schedule 28.02.2012


Ответы (2)


Да:

#include <iostream>
#include <limits>

int main()
{
    std::cout << "Max value of an int on your platform is "
              << std::numeric_limits<int>::max() << "\n";
}

Это первый пример, который пришел на ум. Я уверен, что есть много других. В более общем плане он позволяет выполнять «поиск» во время компиляции по ключевому типу. Очевидно, что в ситуации без шаблона того же можно добиться с помощью определений макросов (INT_MAX и т. д.).

person Oliver Charlesworth    schedule 27.02.2012
comment
Спасибо, Оли, это интересный ответ. Я испытаю ваше терпение, сказав, что на самом деле я ищу ситуацию, когда для данной функции с типом параметра, лексически обозначенным X, есть что-то о X, которое будет меняться в зависимости от предоставленного аргумента. (Я думаю, что ответ, вероятно, нет, но я не совсем уверен.) - person user2023370; 28.02.2012
comment
Хорошо, я сдаюсь. Мой вопрос был плохо сформулирован. То, что вы предоставляете, является полезной информацией. В смысле моего предыдущего комментария я думаю, что ответ отрицательный. - person user2023370; 28.02.2012
comment
@ user643722: Извините, я пропустил ваш предыдущий комментарий. Я думаю, вы спрашиваете, могут ли трейты делать что-либо на основе информации во время выполнения? В этом случае ответ — нет. - person Oliver Charlesworth; 28.02.2012

Если только не проверять информацию о времени компиляции базового типа, например, максимальное и минимальное значение для целочисленных типов или что-то еще.

Настоящая польза от признаков типа заключается в том, чтобы помочь метапрограммированию шаблона, либо путем добавления потока управления с помощью sfinae, либо для создания лучшей ошибки при использовании неправильного типа.

person 111111    schedule 27.02.2012