Может ли параметром функции быть имя типа?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Может ли параметром функции быть имя типа?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Absurd
Сообщения: 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
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

А sizeof ты тоже так вызываешь?

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

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

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

std::cout<<sizeof(int);
, тогда в зависимости от платформы может быть выведено и 4, и 2, и, представь себе, 16.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Decoder
Сообщения: 308
Зарегистрирован: 19 фев 2008, 23:11
Откуда: Moscow

Не подменяй понятия. Твой вопрос касался именно параметров вызываемой функции, а не оператора sizeof. Если нужна полиморфная функция - используй перегрузку или шаблоны.
Поумнеть несложно, куда труднее от дури избавиться.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Мне нужен параметр функции, аналогичный операнду sizeof.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

[quote="Decoder"]Да перегрузить то не сложно, но параметром опять будет переменная. А надо сам тип для вывода в поток некоторой информации о типе. sizeof, numerical_limits<>::max и т.п. Переменную её передавать не нужно вообще, только тип.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Тогда попробуй воспользоваться оператором 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;
}
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

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

#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.
Absurd
Сообщения: 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.));
}
Если нужно вычислить разную информацию о типе используй <type_traits> http://en.cppreference.com/w/cpp/header/type_traits
2B OR NOT(2B) = FF
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Попробуй использовать шаблон...

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

#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;
}
Ответить