2015-08-12 16 views
2

Моя проблема в том, что я не могу передать имя типа функции. Я действительно не знаю, как это сделать, поэтому я спрашиваю себя, возможно ли это, но я так думаю.Как передать имя типа функции?

Так что я хочу создать функцию, которая принимает имена типов, такие как sizeof().

sizeof(int); // accepts a type name not a var 

Мой код пытается реализовать это выглядит следующим образом:

#include "stdafx.h" 
using namespace std; 

void foo(WHAT TO PUT HERE?) {...}; 
int main(){ 
    foo(float); 
    return EXIT_SUCCES; 
} 

В основном моя проблема заключается в том, что я не знаю, как сделать функцию Foo принимать имена типов, как SizeOf(), Что ввести декларацию, чтобы она принимала имена типов?

Благодарим вас за чтение и помощь.

+1

Это невозможно, 'sizeof' - это оператор, а не функция. http://en.cppreference.com/w/cpp/language/sizeof – Melebius

+1

Как вы ожидаете работать с тем, что получит ваша функция? – GSerg

+0

Может использоваться шаблон? 'template void foo() {...}' –

ответ

6

Прежде всего sizeof не является функцией, а оператором (обрабатывается только во время компиляции), и вы не можете создавать собственные операторы.

Возможно, вам нужна «метафункция» - шаблон.

и называют его: foo<MyType>()

помнит - все параметры шаблона и т.д. разрешаемые при компиляции времени, нет никакого способа, чтобы передать тип во время выполнения в C++ (по крайней мере, любой типа)

Тип возврата может быть задан как параметр шаблона (T foo()), полученный от T (typename T::return_type foo()) - если вы правильно подготовили T, или вы можете предоставить специализацию по шаблонам для нужных вам типов (template <> float foo<int>() для возврата float для foo<int> calls)

Если вы действительно необходимо создать макрос, чтобы скрыть шаблон #define fooCall(X) foo<X>(). Но, пожалуйста, не делайте этого, код должен четко указать, что он делает, и , когда. Разница между <> и () показана читателям, когда код оценивается во время выполнения и когда во время компиляции.

+0

специализируются на типах, в которых вы нуждаетесь, и вы играете. –

+0

Это не работает для меня: v – Brogramer

+1

@Brogramer Недостающая часть информации здесь - это то, что вы хотели бы достичь с помощью 'foo', хотите ли вы вернуть значение или производный тип? В зависимости от этого вам может понадобиться либо функция шаблона, либо метафункция. –

Смежные вопросы