Страница 1 из 4
Может ли параметром функции быть имя типа?
Добавлено: 24 ноя 2015, 20:23
Сионист
Может ли параметром функции быть имя типа?
Re: Может ли параметром функции быть имя типа?
Добавлено: 24 ноя 2015, 20:40
Absurd
Сионист писал(а):Может ли параметром функции быть имя типа?
Да, может
Код: Выделить всё
void foo(const char* tyName) {
std: :p uts(tyName);
}
foo("int"); // outputs name of int type
Re: Может ли параметром функции быть имя типа?
Добавлено: 25 ноя 2015, 06:33
Сионист
А sizeof ты тоже так вызываешь?
? Мне придётся тебя разочаровать, но ты всегда получишь количество символов, то есть 4 (3 буквы и терминальный ноль - это как раз 4). Правильно же
, тогда в зависимости от платформы может быть выведено и 4, и 2, и, представь себе, 16.
Re: Может ли параметром функции быть имя типа?
Добавлено: 25 ноя 2015, 07:23
Decoder
Не подменяй понятия. Твой вопрос касался именно параметров вызываемой функции, а не оператора sizeof. Если нужна полиморфная функция - используй перегрузку или шаблоны.
Re: Может ли параметром функции быть имя типа?
Добавлено: 25 ноя 2015, 07:42
Сионист
Мне нужен параметр функции, аналогичный операнду sizeof.
Re: Может ли параметром функции быть имя типа?
Добавлено: 25 ноя 2015, 07:46
Сионист
[quote="Decoder"]Да перегрузить то не сложно, но параметром опять будет переменная. А надо сам тип для вывода в поток некоторой информации о типе. sizeof, numerical_limits<>::max и т.п. Переменную её передавать не нужно вообще, только тип.
Re: Может ли параметром функции быть имя типа?
Добавлено: 25 ноя 2015, 10:31
WinMain
Тогда попробуй воспользоваться оператором
typeid() и классом
type_info
Вот пример как это работает на 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;
}
Re: Может ли параметром функции быть имя типа?
Добавлено: 25 ноя 2015, 11:25
Сионист
Код: Выделить всё
#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;
}
вывело три восьмёрки.
Re: Может ли параметром функции быть имя типа?
Добавлено: 25 ноя 2015, 12:26
Absurd
Сионист писал(а):Мне нужен параметр функции, аналогичный операнду 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.));
}
Если нужно вычислить разную информацию о типе используй <type_traits>
http://en.cppreference.com/w/cpp/header/type_traits
Re: Может ли параметром функции быть имя типа?
Добавлено: 25 ноя 2015, 12:27
WinMain
Попробуй использовать шаблон...
Код: Выделить всё
#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;
}