Может ли параметром функции быть имя типа?
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Может ли параметром функции быть имя типа?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Сионист писал(а):Может ли параметром функции быть имя типа?
Да, может
Код: Выделить всё
void foo(const char* tyName) {
std: :p uts(tyName);
}
foo("int"); // outputs name of int type
2B OR NOT(2B) = FF
А sizeof ты тоже так вызываешь? ? Мне придётся тебя разочаровать, но ты всегда получишь количество символов, то есть 4 (3 буквы и терминальный ноль - это как раз 4). Правильно же , тогда в зависимости от платформы может быть выведено и 4, и 2, и, представь себе, 16.
Код: Выделить всё
std::cout<<sizeof("int");
Код: Выделить всё
std::cout<<sizeof(int);
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Не подменяй понятия. Твой вопрос касался именно параметров вызываемой функции, а не оператора sizeof. Если нужна полиморфная функция - используй перегрузку или шаблоны.
Поумнеть несложно, куда труднее от дури избавиться.
Мне нужен параметр функции, аналогичный операнду sizeof.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
[quote="Decoder"]Да перегрузить то не сложно, но параметром опять будет переменная. А надо сам тип для вывода в поток некоторой информации о типе. sizeof, numerical_limits<>::max и т.п. Переменную её передавать не нужно вообще, только тип.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Тогда попробуй воспользоваться оператором typeid() и классом type_info
Вот пример как это работает на Visual C++
Вот пример как это работает на Visual C++
Код: Выделить всё
#include "stdafx.h"
#include <typeinfo>
void print_type(const type_info& ti)
{
printf("%s\n", ti.raw_name());
}
int _tmain(int argc, _TCHAR* argv[])
{
print_type(typeid(argc));
print_type(typeid(argv));
print_type(typeid(double));
_gettch();
return 0;
}
Код: Выделить всё
#include <typeinfo>
void f(const std::type_info &Type)
{
std::cout<<"sizeof="<<sizeof(Type)<<std::endl;
}
int main ()
{
f(typeid(char));
f(typeid(int));
f(typeid(size_t));
return 0;
}
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Сионист писал(а):Мне нужен параметр функции, аналогичный операнду sizeof.
В С++ если тебе нужно варьировать поведение функции в зависимости от типа аргумента принято применять шаблоны и частичную специализацию.
Вот пример из моего кода - здесь я вычислял ширину ребра графа для graphviz. Весовые коэффициенты разных графов имеют разный тип, так что мне пришлось написать шаблон который их конвертирует в double. Поскольку один из типов CostGraph::Cost не конвертируется в double тривиальным способом, мне пришлось сделать частичную специализацию шаблона специально для CostGraph::Cost.
Код: Выделить всё
template<typename T> struct _2double {
static double calc(T arg);
};
template<typename T> double _2double<T>::calc(T arg) {
return double(arg);
}
template<> double _2double<CostGraph::Cost>::calc(CostGraph::Cost arg)
{
using ddur = std::chrono::duration<double>;
return std::chrono::duration_cast<ddur>(arg).count();
}
template<typename T> int getWidth(T val, T maxVal)
{
double c1 = _2double<T>::calc(val);
double c2 = _2double<T>::calc(maxVal);
return static_cast<int>(1. + 29. * std: :p ow(c1 / c2, 2.));
}
2B OR NOT(2B) = FF
Попробуй использовать шаблон...
Код: Выделить всё
#include "stdafx.h"
#include <typeinfo>
template <typename T>
void PrintTypeInfo(T value)
{
size_t size = sizeof(value);
const type_info& ti = typeid(value);
printf("%d, %s\n", size, ti.name());
};
int _tmain(int argc, _TCHAR* argv[])
{
PrintTypeInfo(argc);
PrintTypeInfo(argv);
PrintTypeInfo(_tmain);
_gettch();
return 0;
}