- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
struct base {
template <class Foo>
base() {}
};
struct derived {
derived()
: base::base<int>() // why not?? WHHYYYY?
{}
};
base b1 = base::base<int>();
base b2<int>();
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
Всего: 19
+14
struct base {
template <class Foo>
base() {}
};
struct derived {
derived()
: base::base<int>() // why not?? WHHYYYY?
{}
};
base b1 = base::base<int>();
base b2<int>();
долбанный комитет
им проще запретить, чем продумать нормальный способ вызова шаблонного конструктора
+48
PHP supports eight primitive types - four scalar types, two compound types and finally three special types.
8 == 4+2+3?
http://www.php.net/manual/en/language.types.intro.php
+32
#include <iostream>
void f(char c) { std::cout << "f(char)" << std::endl; }
void f(signed char c) { std::cout << "f(signed char)" << std::endl; }
void f(unsigned char c) { std::cout << "f(unsigned char)" << std::endl; }
int main()
{
f('a');
f((signed char)('a'));
f((unsigned char)('a'));
return 0;
}
илитный ресурс сегодня мне раскрыл глаза на очередное крестоблядство керниган-гай-ричи-блядство:
с:
The implementation shall define char to have the same range, representation, and behavior as either signed char or unsigned char.
Irrespective of the choice made, char is a separate type from the other two and is not compatible with either.
с++:
Characters can be explicitly declared unsigned or signed. Plain char, signed char, and unsigned char are three distinct types.
+42
objbase.h:
#define __STRUCT__ struct
#define interface __STRUCT__
спасибо Микрософт за счастливое детство соответствие стандарту при засирании глобального неймспейса своими больными фантазиями
+19
// хелпер чтобы конвертить типы строк
template <class S1, class S2>
struct str_convert {
static S1 conv(S2 const & s2) { return str_convert<S2, S1>::conv(s2); } // по умолчанию ищет специализацию для пары S2, S1
static S2 conv(S1 const & s1) { return str_convert<S2, S1>::conv(s1); }
};
// специализация, чтобы не конвертить одно в одно
template <class S>
struct str_convert<S, S> {
static S const & conv(S const & s) { return s; };
};
// специализация, чтобы конвертить std::string <-> std::wstring
template <>
struct str_convert<std::string, std::wstring> {
static std::string conv(std::wstring const & ws) { return boost::locale::conv::utf_to_utf<char>(ws); }
static std::wstring conv(std::string const & s) { return boost::locale::conv::utf_to_utf<wchar_t>(s); }
};
// специализация QString <-> std::string
// skipped
template <class StringType = std::string>
struct some
{
typedef StringType string_type;
typedef std::string utf8_string_type;
some(string_type const & s = string_type())
: inner_string_(s)
{}
template <class S>
some(S const & s)
: inner_string_(str_convert<S, string_type>::conv(s))
{}
string_type inner_string_;
};
int main()
{
std::string s = "hello!";
some<> test0(s); // ok
some<> test2("hello!"); // ха-ха, вот еще, пытаться самостоятельно привести к std::string, пиши специализацию для массивов, сука!
return 0;
}
сегодня ради красоты передачи "literal" в конструктор писал говноспециализации для PodType[N]
+137
#define FMT_2_LEN 16
#define FMT_4_LEN 24
// и т.д. всего около десятка форматов
void calc_check_code(const unsigned char * from, unsigned fmt, unsigned * code)
{
switch (fmt) {
case 2:
//...
memset(data, 0, sizeof(FMT_2_LEN));
// выборочное наполнение data из from
make_code(data, FMT_2_LEN, code);
break;
case 4:
//...
memset(data, 0, sizeof(FMT_4_LEN));
// выборочное наполнение data из from
make_code(data, FMT_2_LEN, code);
break;
// для всех остальных аналогично
}
странно, и почему контрольный код не совпадает с эталонными примерами...
−32
//
// std::string wrapper
//
namespace priv {
class string {
std::string &m_s;
std::string &(std::string::*m_pAssign1)( const char *, std::string::size_type );
std::string &(std::string::*m_pAssign2)( const char * );
public:
string( std::string &str ): m_s(str),
m_pAssign1(&std::string::assign), m_pAssign2(&std::string::assign) {}
string &assign( const char *s, std::string::size_type n )
{
(m_s.*m_pAssign1)( s, n ); return *this;
}
string &assign( const char *s )
{
(m_s.*m_pAssign2)( s ); return *this;
}
};
}
сегодня ассимилирую старый хлам на работе (проекты VC6) в студию с нормальными свойствами проектов, конфигурациями, неабсолютными путями и т.д.
наткнулся в одной из либ на вот это
+139
j = 0;
while (len >= 8)
{
N[0] = N[0] ^ in[j++];
N[1] = N[1] ^ in[j++];
// first round
S = N[0];
N[0] = N[0] + k[0];
N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
N[0] = (N[0]<<11) | (N[0]>>21);
N[0] = N[0]^N[1];
N[1]=S;
S = N[0];
N[0] = N[0] + k[1];
N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
N[0] = (N[0]<<11) | (N[0]>>21);
N[0] = N[0]^N[1];
N[1]=S;
S = N[0];
N[0] = N[0] + k[2];
N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
N[0] = (N[0]<<11) | (N[0]>>21);
N[0] = N[0]^N[1];
N[1]=S;
/* skipped k[3] - k[6] */
S = N[0];
N[0] = N[0] + k[7];
N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
N[0] = (N[0]<<11) | (N[0]>>21);
N[0] = N[0]^N[1];
N[1]=S;
// second round
S = N[0];
N[0] = N[0] + k[0];
N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
N[0] = (N[0]<<11) | (N[0]>>21);
N[0] = N[0]^N[1];
N[1]=S;
/* skipped */
S = N[0];
N[0] = N[0] + k[7];
N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
N[0] = (N[0]<<11) | (N[0]>>21);
N[0] = N[0]^N[1];
N[1]=S;
len = len - 8;
};
if (len > 0)
{
for (i=0;i<len;i++)
((uint8 *)N)[i] = ((uint8 *)N)[i]^((uint8 *)&in[j])[i];
// first round
S = N[0];
N[0] = N[0] + k[0];
N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
N[0] = (N[0]<<11) | (N[0]>>21);
N[0] = N[0]^N[1];
N[1]=S;
/* skipped */
S = N[0];
N[0] = N[0] + k[7];
N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
N[0] = (N[0]<<11) | (N[0]>>21);
N[0] = N[0]^N[1];
N[1]=S;
// second round
S = N[0];
N[0] = N[0] + k[0];
N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
N[0] = (N[0]<<11) | (N[0]>>21);
N[0] = N[0]^N[1];
N[1]=S;
/* skipped */
S = N[0];
N[0] = N[0] + k[7];
N[0] = sbox_ext1[Sa0->b0]^sbox_ext2[Sa0->b1]^sbox_ext3[Sa0->b2]^sbox_ext4[Sa0->b3];
N[0] = (N[0]<<11) | (N[0]>>21);
N[0] = N[0]^N[1];
N[1]=S;
};
полная версия - 250 строк.
это не школолостудентокод, это реальный код, за который когда то кому то были заплачены деньги
+171
static void tm_to_systemtime(const tm* pTime, LPSYSTEMTIME pSysTime )
{
time_t timeT = mktime((tm*)pTime);
FILETIME fTime = {0},lTime = {0};
LONGLONG ll = Int32x32To64(timeT, 10000000) + 116444736000000000;
fTime.dwLowDateTime = (DWORD) ll;
fTime.dwHighDateTime = ll >>32;
FileTimeToLocalFileTime(&fTime,&lTime);
FileTimeToSystemTime(&lTime,pSysTime);
}
static std::string GetDateTimeString(const tm& activ)
{
SYSTEMTIME sysTime = {0};
tm_to_systemtime(&activ,&sysTime);
char str[256];
//format to <YYYYMMDDHHMMSS>
sprintf_s(str,sizeof(str),"%04d%02d%02d%02d%02d%02d",sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,sysTime.wMinute,sysTime.wSecond);
return std::string(str);
}
далеко не самый скучный способ отформатировать ::tm в виде YYYYMMDDHHmmss