Страница 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 ты тоже так вызываешь?

Код: Выделить всё

std::cout<<sizeof("int");
? Мне придётся тебя разочаровать, но ты всегда получишь количество символов, то есть 4 (3 буквы и терминальный ноль - это как раз 4). Правильно же

Код: Выделить всё

std::cout<<sizeof(int);
, тогда в зависимости от платформы может быть выведено и 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;
}