Информация об изменениях

Сообщение Re[8]: Вопрос знатокам от 04.04.2023 22:48

Изменено 04.04.2023 23:02 kov_serg

Re[8]: Вопрос знатокам
Здравствуйте, rg45, Вы писали:

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


R>http://coliru.stacked-crooked.com/a/4b8d981c3e71c47b

Тут можно знатно огрести и потом долго отлаживать.

R>Сразу оговорюсь, что для встроенных типов ADL таким образом не работает. Но я сильно сомневаюсь, что упомянутые выше "портянки" появляются исключительно от использования встроенных типов.

Нет для базовых типов только не для всех, а для этих bool,char,unsigned char,signed char,int,unsigned int,short,unsigned short,long,unsigned long,long long,unsigned long long,float,double
для более специализированных типа std::string и хочется что бы оно искало функцию по сигнатуре. если такая объявлена то пусть использует если нет, то не собирается.

Вот что я хотел:
// header
struct A {
  template<class T> void f(T& t) { void ext_f(T&); ext_f(t); }
};

// impl
#include <stdio.h>
#include <string>
using std::string;
void ext_f(char &v) { printf("char=%d\n",v); }
void ext_f(int &v) { printf("int=%d\n",v); }
void ext_f(string &v) { printf("string=%s\n",v.c_str()); }

int main(int argc, char const *argv[]) {
  A a[1];
  char c=1; int i=2; string s="string";
  a->f(c);
  a->f(i);
  a->f(s);
  return 0;
}
Re[8]: Вопрос знатокам
Здравствуйте, rg45, Вы писали:

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


R>http://coliru.stacked-crooked.com/a/4b8d981c3e71c47b

Тут можно знатно огрести и потом долго отлаживать.

R>Сразу оговорюсь, что для встроенных типов ADL таким образом не работает. Но я сильно сомневаюсь, что упомянутые выше "портянки" появляются исключительно от использования встроенных типов.

Нет для базовых типов только не для всех, а для этих bool,char,unsigned char,signed char,int,unsigned int,short,unsigned short,long,unsigned long,long long,unsigned long long,float,double
для более специализированных типа std::string и хочется что бы оно искало функцию по сигнатуре. если такая объявлена то пусть использует если нет, то не собирается.

Вот что я хотел:
struct A {
    template<class T>void f(T& t) { void ext_f(A*,T&); ext_f(this,t); }
};

#include <stdio.h>
#include <string>
using std::string;
void ext_f(A* self,char &v) { printf("char=%d\n",v); }
void ext_f(A* self,signed char &v) { printf("signed char=%d\n",v); }
void ext_f(A* self,unsigned char &v) { printf("unsigned char=%d\n",v); }
void ext_f(A* self,int &v)  { printf("int=%d\n",v); }
void ext_f(A* self,string &v)  { printf("string=%s\n",v.c_str()); }

int main(int argc, char const *argv[]) {
    A a[1]; char c=1; signed char cs=2; unsigned char cu=3; 
    int i=4; string s="string";
    a->f(c);
    a->f(cs);
    a->f(cu);
    a->f(i);
    a->f(s);
    return 0;
}

char=1
signed char=2
unsigned char=3
int=4
string=string