Создание экземпляра шаблона может выводить только его параметры из аргументов в заданный шаблонный объект (функция в этом случае), так что нет, тип переменной не имеет значения при выводе, и вам либо нужно предоставить фиктивный аргумент типа T функции или
Существует возможное обходное решение с использованием вывода типа, представленного в комментариях:
#include
namespace byte_read {
//this is a hack to deduce the type using implicit conversion
struct type_converter {
const char* buffer;
template
operator T() {
std::cout << "implicit convertion from " << typeid(buffer).name()
<< " to " << typeid(T).name() << std::endl;
//casting memory to the desired type
return static_cast(*buffer);
}
};
type_converter getValue(const char * buffer) {
//here buffer is implicitly converted to T type using the operator T()
return {buffer};
}
}
using namespace byte_read;
int main()
{
char buffer[]{0,1,0,0 //int 256 encoded
,97 //char 'a' encoded
};
//pointer to read the buffer sequentialy
char* pos = buffer;
//pointer used to count the bytes readed
char* last_pos = pos;
int int_256 = getValue(pos);
pos+=sizeof(int);
std::cout << int_256 << " bytes readed :" << pos - last_pos << std::endl;
last_pos = pos;
char char_a = getValue(pos);
pos+=sizeof(char);
std::cout << char_a << " bytes readed :" << pos - last_pos << std::endl;
}
Вы можете попробуйте здесь
Для получения полностью определенного названия машины мы должны сначала получить локальное имя хоста и затем поиск каноническое имя.
самый легкий способ сделать это первым получением локального имени хоста с помощью uname()
или gethostname()
и затем выполняя поиск с gethostbyname()
и смотря h_name
член структуры, которую это возвращает. При использовании ANSI c Вы должны использование uname()
вместо gethostname()
.
Пример:
char hostname[1024];
hostname[1023] = '\0';
gethostname(hostname, 1023);
printf("Hostname: %s\n", hostname);
struct hostent* h;
h = gethostbyname(hostname);
printf("h_name: %s\n", h->h_name);
, К сожалению, gethostbyname()
удерживается от использования в текущей спецификации POSIX, поскольку она не играет хорошо с IPv6. Более современная версия этого кода использовала бы getaddrinfo()
.
Пример:
struct addrinfo hints, *info, *p;
int gai_result;
char hostname[1024];
hostname[1023] = '\0';
gethostname(hostname, 1023);
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; /*either IPV4 or IPV6*/
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_CANONNAME;
if ((gai_result = getaddrinfo(hostname, "http", &hints, &info)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(gai_result));
exit(1);
}
for(p = info; p != NULL; p = p->ai_next) {
printf("hostname: %s\n", p->ai_canonname);
}
freeaddrinfo(info);
, Конечно, это будет только работать, если машина будет иметь FQDN для предоставления - в противном случае, результат эти getaddrinfo()
заканчивает тем, что совпал с неполным именем хоста.
gethostname()
POSIX способ получить локальное имя хоста. Выезд man
.
функция BSD getdomainname()
может дать Вам доменное имя, таким образом, можно создать полностью определенное имя хоста. Нет никакого POSIX способа получить домен, я боюсь.
Я полагаю, что Вы ищете:
Просто передают его localhost IP.
существует также функция gethostbyname, которая также полезна.
Простой способ, попробуйте uname ()
, Если это не работает, используйте gethostname () затем gethostbyname () и наконец gethostbyaddr ()
, h_name hostent {} должен быть Вашим FQDN