Хорошо, прежде всего до сих пор это работает, но чрезвычайно багги. Я хочу, чтобы он мог принимать ints
, floats
, doubles
, strings
и char*s
. Это вроде работы, пытаясь все как char *, но если это не удается, мне бы хотелось, чтобы он повторил это как другой тип. Мне также хотелось бы, чтобы мне не пришлось передавать количество параметров. (Больше на дне)Вариадическая функция с различными типами, переходящая к резьбовому cout
#include <iostream>
#include <cstdlib>
#include <sstream>
#include <iostream>
#include <windows.h>
#include <ctime>
#include <tchar.h>
#include <stdio.h>
#include <vector>
#include <thread>
const enum loglevel{INFO,WARNING,OK,SEVERE};
void logHelperMessage(loglevel,int, ...);
void threadedloghelpermessage(loglevel,string);
int main(int argc, char **argv)
{
logHelperMessage(INFO,4,"Hi","I","DO","WORK");
}
void logHelperMessage(loglevel severity,int number, ...)
{
va_list messages;
va_start(messages,number);
std::stringstream ss;
for(int i = 0;i < number;i++)
{
ss << va_arg(messages,char*);
}
std::string s = ss.str();
thread t1(threadedloghelpermessage,severity,s);
t1.join();
}
void threadedloghelpermessage(loglevel severity,string message)
{
//TODO: implement a stack?
switch (severity)
{
case INFO:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE);
cout << "[IF]";
break;
case WARNING:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x06);
cout << "[WA]";
break;
case OK:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);
cout << "[OK]";
break;
case SEVERE:
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
cout << "[ER]";
break;
default:
break;
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x08);
time_t t = time(0);
struct tm now;
localtime_s(&now, &t);
cout << "[";
int hour = now.tm_hour;
if(hour < 10)
{
cout << 0 << hour << ":";
}
else
{
cout << hour << ":";
}
int minu = now.tm_min;
if(minu < 10)
{
cout << 0 << minu << ":";
}
else
{
cout << minu << ":";
}
int sec = now.tm_sec;
if(sec < 10)
{
cout << 0 << sec;
}
else
{
cout << sec;
}
cout << "] ";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),0x07);
cout << message << endl;
}
Теперь, есть в любом случае:
- Есть выход нитей к консоли без них сбой или подвесить основную программу как нить воссоединяется (ThreadPool?)
- Использование:
logHelperMessage(logLevel,firstpram,...)
(используйте первый флажок, чтобы получить свое пометку и перейти оттуда?) - В:
ss << va_arg(messages,char*);
если он не работает какchar*
, попробуйте что-нибудь еще?
Я огляделся по более продвинутым варидическим функциям, но, похоже, для них требуется целый ряд аргументов. или только один тип. Кроме того, если требуется непрерывный цикл, у меня есть петля, установленная где-то еще в программе. (я думаю, что это все)
делает это только для ввода одного типа коляски? IE: все строки или все ints. –
@StevenVenham: Вы имеете в виду, что он должен проверить, что все аргументы одного типа? –
Нет, я имею в виду, начиная с его типа T, как он принимает аргументы и использует их, как там T? Например, если я передал: «Привет», 1,3.4, «O» понял бы, что существует множество различных типов аргументов? –