powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите победить изврат с шаблонами
25 сообщений из 27, страница 1 из 2
Помогите победить изврат с шаблонами
    #38903929
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хочу следующее: если размер значения входит в указатель, то сохранить его в указатель void*, если большой, то выделить память и сохранять туда.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
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));
		}
	}
}



Так компилируется
Код: plaintext
1.
2.
3.
4.
void  main(){
	int i = 1;
	f(i);
}



А так нет
Код: plaintext
1.
2.
3.
4.
void  main(){
	double j = 2;
	f(j);
}



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

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

В иделе хочется как-то препроцессор задействовать, чтобы лишнего if`а не стало.
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904002
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
void  main(){
	double j = (double)2;
	f(j);
}



Код: plaintext
1.
2.
3.
4.
void  main(){
	double j = 2.0;
	f(j);
}


?
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904013
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
void  main(){
	double j = static_cast<double>( 2 );
	f(j);
}
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904014
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, там шаблон f(), если использовать первый main() - компилируется, второй - нет. Как обойти не знаю, может есть какой синтаксис.
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904018
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А. Понял. Я не туда смотрел.
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904025
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
присвоение j ни при чем, так компилируется
Код: plaintext
1.
2.
3.
4.
void  main(){
	double j = 2;
	//f(j);
}
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904040
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, а так, если:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
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 );
}

не компилял, есичё
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904041
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если цель - просто чтобы скомпилировалось, то можно влепить
Код: plaintext
1.
*(T*)&ptr=x;

и сделать вид будто так и надо.
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904045
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TМожет как-то можно по другому обойти?
Не мелочись:
Код: sql
1.
2.
3.
4.
5.
template< typename T >
void f(T& x)
{
	static T v = x;
}


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904102
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych, не взлетело
Код: plaintext
1.
template< typename T, true >


error C2059: syntax error : 'constant'


wst, помогло. Но допилить бы вариант egorych
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904106
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tegorych, не взлетелочастичная специализация шаблона функции запрещена, по моему, надо в структуру переделать, ща сделаем
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904113
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, это передача инфы другому трэду: указатель в queue<void*>, в другом трэде из очереди и вызов callback функции с параметрами. По хорошему хотел чтобы и все было шаблонами, но на первом шаге (добавление в очередь) уже мозг сломал шаблонами :)
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904133
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПо хорошему хотел чтобы и все было шаблонами
Тогда, раз уж встал на порочный путь шаблонов, отказывайся от void* и делай очередь из
шаблонных классов-обёрток.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904137
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По идее компилятор должен вообще выкинуть эту строчку вместе с if() т.к. для double будет
Код: plaintext
1.
2.
3.
4.
5.
if(8 <= 4) {
	ptr = (void*)x;
} else {
	void* ptr = malloc(sizeof(T));
...



Хотя может и выкинет, но ситаксис раньше проверяется.
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904144
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovDima TПо хорошему хотел чтобы и все было шаблонами
Тогда, раз уж встал на порочный путь шаблонов, отказывайся от void* и делай очередь из
шаблонных классов-обёрток.

Попытался встать но не устоял. Как-то меня этот путь уже все меньше и меньше привлекает.
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904153
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

Частичные специализации функций не разрешены.
Ну и синтаксис немного другой, если бы были разрешены ))

Так что наверно самый простой вариант тот что предложил wst.
Надо будет только игнорировать предупреждения компилятора.

А вообще, рекомендую Dima T отказаться от этой затеи :)
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904162
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПо идее компилятор должен вообще выкинуть эту строчку

Хотя может и выкинет, но ситаксис раньше проверяется.
По стандарту ошибки надо выдавать как если бы никакой оптимизации не было.
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904171
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всегда знал, что Страуструп был извращенец. Есть такой термин - анальный секс. Вот с его помощью, через то самое место, то есть жопу и делается.

Пример кода методом компиляции кучи кусков из google приведен. Пиво высылать в СПб (я люблю Туборг). Можно высылать деньги до востребования в бар Рок-Паб на Невском (в переводе написать "для любителей Rammstein")

IMHO & AFAIK

Ссылки в гугле:
http://stackoverflow.com/questions/1416345/c-template-specialization
мораль - Function templates cannot be partially specialised, only fully (((

http://bytes.com/topic/c/answers/527597-template-function-specialization-inside-template-class-possible
мораль - приведен пример с классом proxy. Еще пару литров алкоголя и можно допилить напильником


// ConsoleApplication2.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <malloc.h>

void* ptr = NULL;
bool is_ptr = false;

// Из-за C2141 через жопу
class proxy
{
public:
template<typename T>
static void f(T t)
{
printf("proxy\n");
}
};

template <typename T>
class A {
public:
template <bool is_inline >
static void f(T x);

template <>
static void f<true>(T x) {
printf( "true store_in_ponter sizeof(x)=%i\n", sizeof(x) );

ptr = (void*)x;
is_ptr = false;
}

template <>
static void f<false>(T x) {
printf( "false store_in_heap sizeof(x)=%i \n", sizeof(x) );

ptr = malloc( sizeof(T) );
if(ptr) {
is_ptr = true;
memcpy(ptr, &x, sizeof(T));
}
}

};

template< typename T >
void f(T& x)
{
A<T>::f< sizeof(T) <= sizeof(void*) >( x );
}

int _tmain(int argc, _TCHAR* argv[])
{
int i = 1;
f(i);
double d = 2;
f(d);
getchar();
return 0;
}
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904180
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тег SRC забыл:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
// ConsoleApplication2.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <malloc.h>

void* ptr = NULL;
bool is_ptr = false;

// Из-за C2141 через жопу
class proxy
{
public:
template<typename T>
static void f(T t)
{
	printf("proxy\n");
}
};

template <typename T> 
class A {
public:
template <bool is_inline > 
static void f(T x);

template <> 
static void f<true>(T x) {
	printf( "true store_in_ponter sizeof(x)=%i\n", sizeof(x) );

	ptr = (void*)x;
	is_ptr = false;
}

template <> 
static void f<false>(T x) {
	printf( "false store_in_heap sizeof(x)=%i \n", sizeof(x) );

	ptr = malloc( sizeof(T) );
	if(ptr) {
		is_ptr = true;
		memcpy(ptr, &x, sizeof(T));
	}
}

};

template< typename T >
void f(T& x)
{
	A<T>::f< sizeof(T) <= sizeof(void*) >( x );
}

int _tmain(int argc, _TCHAR* argv[])
{
	int i = 1;
	f(i);
	double d = 2;
	f(d);
	getchar();
	return 0;
}


...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904196
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЧастичные специализации функций не разрешены.
Ну и что? ))) подумаешь, не разрешены )))

Через proxy класс вполне можно и даже, по результату, код вполне читабельно-понятный. Но вот написать.... б.... матных слов в русском языке не хватает

Кто такое придумал, с ним не анальным сексом, а минимум фиггинг'ом заниматься.
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904203
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно класс proxy нафиг не нужен. Достаточно только класса A )))
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904223
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tдопилить бы вариант egorych
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
#include <stdlib.h>
#include <cstring>

void* ptr = nullptr;
bool is_ptr = false;

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

template< typename T >
struct allocator < T, true >
{
	void alloc( T &x ) { 
		is_ptr = false;
		ptr = reinterpret_cast< void* >( x ); 
	}
};

template< typename T >
void f( T &x )
{
	allocator< T, sizeof( T ) <= sizeof( void* ) > a;
	a.alloc( x );
}

int main( int argc, char *argv[] )
{
	int i = 7;
	f( i );

	double d = 100.500;
	f( d );

	return 0;
}
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904227
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyegorych,

Частичные специализации функций не разрешены.
Ну и синтаксис немного другой, если бы были разрешены ))шаблонный синтаксис, пока его вспомнишь, как правильно, семь потов сойдёт )))
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904238
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вариант wst победил по количеству символов. Лишний код выкинул компилятор, поэтому в плане производительности никакой разницы.
...
Рейтинг: 0 / 0
Помогите победить изврат с шаблонами
    #38904248
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВариант wst победил по количеству символов.скучный ты
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите победить изврат с шаблонами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]