Как шаблон сделать
От: Аноним  
Дата: 27.07.05 14:27
Оценка:
Есть нечто вроде

struct S{
int operator[]( int i ){ ... }
};

Хочу сделать, чтобы помимо этого была специализация для случая, когда в качестве i передаётся константа 0.
Re: Как шаблон сделать
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 27.07.05 14:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть нечто вроде


А>struct S{

А> int operator[]( int i ){ ... }
А>};

А>Хочу сделать, чтобы помимо этого была специализация для случая, когда в качестве i передаётся константа 0.


Если i известно только в рантайме (что, скорее всего, так и есть), то подойдет только такая "специализация":

int S::operator [] (int i)
{
  if(0 == i)
    // ...
  else
    // ..
}


Если же во время компиляции, то так:

template <int I>
struct S
{
  // ...
};

template<>
struct S<0>
{
  // ...
};
HgLab: Mercurial Server and Repository Management for Windows
Re[2]: Как шаблон сделать
От: Аноним  
Дата: 27.07.05 14:51
Оценка:
Здравствуйте, Нахлобуч, Вы писали:

Н>Здравствуйте, Аноним, Вы писали:


А>>Есть нечто вроде


А>>struct S{

А>> int operator[]( int i ){ ... }
А>>};

А>>Хочу сделать, чтобы помимо этого была специализация для случая, когда в качестве i передаётся константа 0.


Н>Если i известно только в рантайме (что, скорее всего, так и есть), то подойдет только такая "специализация":


Н>
Н>int S::operator [] (int i)
Н>{
Н>  if(0 == i)
Н>    // ...
Н>  else
Н>    // ..
Н>}
Н>


Н>Если же во время компиляции, то так:


Н>
Н>template <int I>
Н>struct S
Н>{
Н>  // ...
Н>};

Н>template<>
Н>struct S<0>
Н>{
Н>  // ...
Н>};
Н>


Да, вот только шаблон для оператора хотелось бы. Причём, чтобы в зависимости от того переменная или 0 передаются в оператор, выбиралась соответствующая специализация.
Re: Как шаблон сделать
От: Аноним  
Дата: 27.07.05 14:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть нечто вроде


А>struct S{

А> int operator[]( int i ){ ... }
А>};

А>Хочу сделать, чтобы помимо этого была специализация для случая, когда в качестве i передаётся константа 0.


по-моему в compile-time никак. только if (i == 0) ...
Re: Как шаблон сделать
От: ArtDenis Россия  
Дата: 27.07.05 15:18
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>struct S{

А> int operator[]( int i ){ ... }
А>};
А>Хочу сделать, чтобы помимо этого была специализация для случая, когда в качестве i передаётся константа 0.

С такими задачами нужно на Пролог переходить
... << RSDN@Home 1.1.4 stable rev. 510>>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: Как шаблон сделать
От: Владик Россия  
Дата: 27.07.05 15:33
Оценка: 100 (10)
Здравствуйте, Аноним, Вы писали:

А>Да, вот только шаблон для оператора хотелось бы. Причём, чтобы в зависимости от того переменная или 0 передаются в оператор, выбиралась соответствующая специализация.


Если я правильно понял, то вот это поможет:
struct int_wrapper
{
    int_wrapper(int i);
...
};

struct S{
  int operator[]( int_wrapper i ); // (1)
  int operator[]( void* );         // (2)
};

int main()
{
S s;
    s[0];  // (2)
    s[1];  // (1)
int i = 0;
    s[i];  // (1)
    s[++i];// (1)
    
    return 0;
}
Как все запущенно...
Re[4]: Как шаблон сделать
От: ArtDenis Россия  
Дата: 27.07.05 16:01
Оценка:
Здравствуйте, Владик, Вы писали:

В>Если я правильно понял, то вот это поможет:


Вот это да... Работает!
Только не понятно, почему для s[0] компилятор вызывает int operator[]( void* ), а не пишет о неопределённости.
... << RSDN@Home 1.1.4 stable rev. 510>>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[5]: Как шаблон сделать
От: Lorenzo_LAMAS  
Дата: 27.07.05 16:10
Оценка:
По правилам перегрузки. 0->void * лучше подходит, чем пользовательское преобразование.
Of course, the code must be complete enough to compile and link.
Re[4]: Как шаблон сделать
От: MaximE Великобритания  
Дата: 28.07.05 08:47
Оценка: 3 (1)
Владик wrote:

> Здравствуйте, Аноним, Вы писали:

>
> А>Да, вот только шаблон для оператора хотелось бы. Причём, чтобы в зависимости от того переменная или 0 передаются в оператор, выбиралась соответствующая специализация.
>
> Если я правильно понял, то вот это поможет:
>
> struct int_wrapper
> {
>     int_wrapper(int i);
> ...
> };
>
> struct S{
>   int operator[]( int_wrapper i ); // (1)
>   int operator[]( void* );         // (2)
> };
>
> int main()
> {
> S s;
>     s[0];  // (2)
>     s[1];  // (1)
> int i = 0;
>     s[i];  // (1)
>     s[++i];// (1)
>    return 0;
> }
>
>


Компиляторы пишут не глупые, поэтому выпендриваться не стоит.

Если ф-ия инлайновая, вот что происходит:

#include <cstdio>

inline void f(int n)
{
     if(0 == n)
         printf("zero\n");
     else if(5 == n)
         printf("five\n");
     else
         printf("%d\n", n);
}

int main(int ac, char**)
{
     f(0);
     f(1);
     f(ac);
}


g++ -S -masm=intel -O3 -Wall -c exp.cpp -o exp.s


Никаких if'ов для вызовов с константами в следующем коде:

    .file    "exp.cpp"
    .intel_syntax
    .section    .rodata.str1.1,"aMS",@progbits,1
.LC0:
    .string    "zero"
.LC1:
    .string    "%d\n"
.LC2:
    .string    "five"
    .text
    .align 2
    .p2align 2,,3
.globl main
    .type    main, @function
main:
.LFB14:
    push    %ebp
.LCFI0:
    mov    %ebp, %esp
.LCFI1:
    push    %ebx
.LCFI2:
    push    %ecx
    mov    %ebx, DWORD PTR [%ebp+8]
    and    %esp, -16
    sub    %esp, 28
;
; f(0);
;
    push    OFFSET FLAT:.LC0
.LCFI3:
    call    puts
    pop    %eax
    pop    %edx
;
; f(1);
;
    push    1
    push    OFFSET FLAT:.LC1
    call    printf
    add    %esp, 16
;
; f(ac);
;
    test    %ebx, %ebx
    je    .L9
    cmp    %ebx, 5
    je    .L10
    sub    %esp, 8
    push    %ebx
    push    OFFSET FLAT:.LC1
    call    printf
    add    %esp, 16
    xor    %eax, %eax
    mov    %ebx, DWORD PTR [%ebp-4]
    leave
    ret
    .p2align 2,,3
.L10:
    sub    %esp, 12
    push    OFFSET FLAT:.LC2
    call    puts
    add    %esp, 16
    xor    %eax, %eax
    mov    %ebx, DWORD PTR [%ebp-4]
    leave
    ret
    .p2align 2,,3
.L9:
    sub    %esp, 12
    push    OFFSET FLAT:.LC0
    call    puts
    add    %esp, 16
    xor    %eax, %eax
    mov    %ebx, DWORD PTR [%ebp-4]
    leave
    ret
.LFE14:
    .size    main, .-main
    .section    .eh_frame,"a",@progbits
.Lframe1:
    .long    .LECIE1-.LSCIE1
.LSCIE1:
    .long    0x0
    .byte    0x1
    .string    "zP"
    .uleb128 0x1
    .sleb128 -4
    .byte    0x8
    .uleb128 0x5
    .byte    0x0
    .long    __gxx_personality_v0
    .byte    0xc
    .uleb128 0x4
    .uleb128 0x4
    .byte    0x88
    .uleb128 0x1
    .align 4
.LECIE1:
.LSFDE1:
    .long    .LEFDE1-.LASFDE1
.LASFDE1:
    .long    .LASFDE1-.Lframe1
    .long    .LFB14
    .long    .LFE14-.LFB14
    .uleb128 0x0
    .byte    0x4
    .long    .LCFI0-.LFB14
    .byte    0xe
    .uleb128 0x8
    .byte    0x85
    .uleb128 0x2
    .byte    0x4
    .long    .LCFI1-.LCFI0
    .byte    0xd
    .uleb128 0x5
    .byte    0x4
    .long    .LCFI2-.LCFI1
    .byte    0x83
    .uleb128 0x3
    .byte    0x4
    .long    .LCFI3-.LCFI2
    .byte    0x2e
    .uleb128 0x10
    .align 4
.LEFDE1:
    .ident    "GCC: (GNU) 4.0.1 20050727 (Red Hat 4.0.1-5)"
    .section    .note.GNU-stack,"",@progbits


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[5]: Как шаблон сделать
От: Владик Россия  
Дата: 28.07.05 09:02
Оценка: +1
Здравствуйте, MaximE, Вы писали:

ME>Никаких if'ов для вызовов с константами в следующем коде:


И чего? Практическая ценность предложенного решения стремится к нулю, я не спорю. Но причем здесь оптимизации на уровне кодогенератора?
Как все запущенно...
Re[6]: Как шаблон сделать
От: MaximE Великобритания  
Дата: 28.07.05 09:06
Оценка:
Владик wrote:

> Здравствуйте, MaximE, Вы писали:

>
> ME>Никаких if'ов для вызовов с константами в следующем коде:
>
> И чего? Практическая ценность предложенного решения стремится к нулю, я не спорю. Но причем здесь оптимизации на уровне кодогенератора?

В том, что не нужно пытаться экономить на спичках или пытаться предсказать, во что скомпилируется код. Если есть сомнения — смотри в asm.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9
Re[7]: Как шаблон сделать
От: Владик Россия  
Дата: 28.07.05 09:19
Оценка:
Здравствуйте, MaximE, Вы писали:

>> Но причем здесь оптимизации на уровне кодогенератора?

ME>В том, что не нужно пытаться экономить на спичках или пытаться предсказать, во что скомпилируется код. Если есть сомнения — смотри в asm.

А. Ну я так понял (по привычке ), что compile-time критично.
Как все запущенно...
Re[5]: Как шаблон сделать
От: Lorenzo_LAMAS  
Дата: 28.07.05 10:37
Оценка: +1
ИМХО на исходный вопрос он все же вполне ответил. Какая задача, такое и решение.
Of course, the code must be complete enough to compile and link.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.