Помогите победить изврат с шаблонами

Dima T
Дата: 13.03.2015 14:31:31
Хочу следующее: если размер значения входит в указатель, то сохранить его в указатель void*, если большой, то выделить память и сохранять туда.
void* ptr = NULL;
bool is_ptr = false;

template< typename T >
void f(T& x)
{
	if(sizeof(T) <= sizeof(void*)) {
		ptr = (void*)x;
	} else {
		void* ptr = malloc(sizeof(T));
		if(ptr) {
			is_ptr = true;
			memcpy(ptr, &x, sizeof(T));
		}
	}
}


Так компилируется
void  main(){
	int i = 1;
	f(i);
}


А так нет
void  main(){
	double j = 2;
	f(j);
}


error C2440: 'type cast' : cannot convert from 'double' to 'void *'
На красной строчке, но она никогда не выполнится.

Может как-то можно по другому обойти? MS VC 2008

В иделе хочется как-то препроцессор задействовать, чтобы лишнего if`а не стало.
mayton
Дата: 13.03.2015 15:07:44
void  main(){
	double j = (double)2;
	f(j);
}


void  main(){
	double j = 2.0;
	f(j);
}

?
mayton
Дата: 13.03.2015 15:11:50
void  main(){
	double j = static_cast<double>( 2 );
	f(j);
}
Dima T
Дата: 13.03.2015 15:11:50
mayton, там шаблон f(), если использовать первый main() - компилируется, второй - нет. Как обойти не знаю, может есть какой синтаксис.
mayton
Дата: 13.03.2015 15:12:43
А. Понял. Я не туда смотрел.
Dima T
Дата: 13.03.2015 15:15:39
присвоение j ни при чем, так компилируется
void  main(){
	double j = 2;
	//f(j);
}
egorych
Дата: 13.03.2015 15:26:15
Dima T, а так, если:
void* ptr = NULL;
bool is_ptr = false;

template< typename T, bool size_of_ptr >
void f(T& x)
{
	void* ptr = malloc(sizeof(T));
	if(ptr) {
		is_ptr = true;
		memcpy(ptr, &x, sizeof(T));
	}
}

template< typename T, true >
void f( T &x )
{
	ptr = reinterpret_cast< void* >( x );
}

template< typename T >
void runner( T &x )
{
	f< T, sizeof(T) <= sizeof(void*) >( x );
}
не компилял, есичё
wst
Дата: 13.03.2015 15:26:24
Если цель - просто чтобы скомпилировалось, то можно влепить
*(T*)&ptr=x;
и сделать вид будто так и надо.
Dimitry Sibiryakov
Дата: 13.03.2015 15:27:11

Dima T
Может как-то можно по другому обойти?

Не мелочись:
template< typename T >
void f(T& x)
{
	static T v = x;
}

Posted via ActualForum NNTP Server 1.5

Dima T
Дата: 13.03.2015 15:53:02
egorych, не взлетело
template< typename T, true >

error C2059: syntax error : 'constant'


wst, помогло. Но допилить бы вариант egorych