Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите победить изврат с шаблонами / 25 сообщений из 27, страница 1 из 2
13.03.2015, 14:31
    #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
13.03.2015, 15:07
    #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
13.03.2015, 15:11
    #38904013
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить изврат с шаблонами
Код: plaintext
1.
2.
3.
4.
void  main(){
	double j = static_cast<double>( 2 );
	f(j);
}
...
Рейтинг: 0 / 0
13.03.2015, 15:11
    #38904014
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить изврат с шаблонами
mayton, там шаблон f(), если использовать первый main() - компилируется, второй - нет. Как обойти не знаю, может есть какой синтаксис.
...
Рейтинг: 0 / 0
13.03.2015, 15:12
    #38904018
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить изврат с шаблонами
А. Понял. Я не туда смотрел.
...
Рейтинг: 0 / 0
13.03.2015, 15:15
    #38904025
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить изврат с шаблонами
присвоение j ни при чем, так компилируется
Код: plaintext
1.
2.
3.
4.
void  main(){
	double j = 2;
	//f(j);
}
...
Рейтинг: 0 / 0
13.03.2015, 15:26
    #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
13.03.2015, 15:26
    #38904041
wst
wst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить изврат с шаблонами
Если цель - просто чтобы скомпилировалось, то можно влепить
Код: plaintext
1.
*(T*)&ptr=x;

и сделать вид будто так и надо.
...
Рейтинг: 0 / 0
13.03.2015, 15:27
    #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
13.03.2015, 15:53
    #38904102
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить изврат с шаблонами
egorych, не взлетело
Код: plaintext
1.
template< typename T, true >


error C2059: syntax error : 'constant'


wst, помогло. Но допилить бы вариант egorych
...
Рейтинг: 0 / 0
13.03.2015, 15:54
    #38904106
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить изврат с шаблонами
Dima Tegorych, не взлетелочастичная специализация шаблона функции запрещена, по моему, надо в структуру переделать, ща сделаем
...
Рейтинг: 0 / 0
13.03.2015, 15:59
    #38904113
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить изврат с шаблонами
Dimitry Sibiryakov, это передача инфы другому трэду: указатель в queue<void*>, в другом трэде из очереди и вызов callback функции с параметрами. По хорошему хотел чтобы и все было шаблонами, но на первом шаге (добавление в очередь) уже мозг сломал шаблонами :)
...
Рейтинг: 0 / 0
13.03.2015, 16:11
    #38904133
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить изврат с шаблонами
Dima TПо хорошему хотел чтобы и все было шаблонами
Тогда, раз уж встал на порочный путь шаблонов, отказывайся от void* и делай очередь из
шаблонных классов-обёрток.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
13.03.2015, 16:13
    #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
13.03.2015, 16:14
    #38904144
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить изврат с шаблонами
Dimitry SibiryakovDima TПо хорошему хотел чтобы и все было шаблонами
Тогда, раз уж встал на порочный путь шаблонов, отказывайся от void* и делай очередь из
шаблонных классов-обёрток.

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

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

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

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

Хотя может и выкинет, но ситаксис раньше проверяется.
По стандарту ошибки надо выдавать как если бы никакой оптимизации не было.
...
Рейтинг: 0 / 0
13.03.2015, 16:25
    #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
13.03.2015, 16:28
    #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
13.03.2015, 16:37
    #38904196
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить изврат с шаблонами
Anatoly MoskovskyЧастичные специализации функций не разрешены.
Ну и что? ))) подумаешь, не разрешены )))

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

Кто такое придумал, с ним не анальным сексом, а минимум фиггинг'ом заниматься.
...
Рейтинг: 0 / 0
13.03.2015, 16:41
    #38904203
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить изврат с шаблонами
Собственно класс proxy нафиг не нужен. Достаточно только класса A )))
...
Рейтинг: 0 / 0
13.03.2015, 16:51
    #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
13.03.2015, 16:53
    #38904227
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите победить изврат с шаблонами
Anatoly Moskovskyegorych,

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


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