Здравствуйте, SVV, Вы писали:
SVV>как это сделать? компилятору не нравится строка "#if sizeof(T)<16"
Как починить — уже сказали, я лишь добавлю, что препроцессинг — это очень ранняя фаза компиляции, когда текст программы — не более чем текст, и никакими типами и шаблонами во время работы препроцессора и не пахнет, их просто не существует еще.
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, SVV, Вы писали:
SVV>>как это сделать? компилятору не нравится строка "#if sizeof(T)<16"
U>предположу, что вам нужно это: http://en.cppreference.com/w/cpp/language/alignof U>если же хочется именно свой велосипед, то сформулируйте задачу более полно, мы вам предложим решение U>то, что вы написали, можно переписать так: U>1) http://ideone.com/uCCJNh U>2) http://ideone.com/ZkDoN0
спасибо. я обязательно изучу попозже то что вы написали. на данный момент реализация кажется очень сложной, но чего не сделаешь ради краткости и эффективности клиентского кода.
В D подаваться не планирую
Здравствуйте, TarasB, Вы писали:
TB>А вообще — это вам в D надо, потому что крестокомитет будет очень долго думать, прежде чем наконец-то одобрит static if
а зачем static if отличать от обычного if?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
V>Здравствуйте, TarasB, Вы писали:
TB>>А вообще — это вам в D надо, потому что крестокомитет будет очень долго думать, прежде чем наконец-то одобрит static if V>а зачем static if отличать от обычного if?
Потому что static if бывает не только в теле функции, но и в другом месте.
Вот как такое сделать на обычном иф?
const int i = 3;
class C {
static if (i == 3) // ok
int x;
else
long x;
};
Только если разрешить упарываться метом непосредственно на С++
Ну и как бы гарантия, что он отработает на стадии компиляции.
SVV>как это сделать? компилятору не нравится строка "#if sizeof(T)<16"
Проще всего так:
return sizeof(T)<16 ? 10 : 20;
вообще выражение sizeof(T)<16 ? 10 : 20 — это выражение времени компиляции, так что можешь использовать его где угодно, хоть в качестве размера массива:
Здравствуйте, Vain, Вы писали:
V>а зачем static if отличать от обычного if?
1) условная компиляция — выражений, типов, интерфейсов — аналог #if, но на уровне языка, а не препроцессора
2) условное инстанцирование шаблонов (то, что писалось SFINAE, можно сделать через static if)
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, SVV, Вы писали:
SVV>>как это сделать? компилятору не нравится строка "#if sizeof(T)<16"
U>предположу, что вам нужно это: http://en.cppreference.com/w/cpp/language/alignof U>если же хочется именно свой велосипед, то сформулируйте задачу более полно, мы вам предложим решение U>то, что вы написали, можно переписать так: U>1) http://ideone.com/uCCJNh U>2) http://ideone.com/ZkDoN0
а без std::enable_if можно как-то?
например как скомпилировать код:
template <class T=DWORD>
T ReverseBytes(DWORD &i_rVal, bool i_bReverse)
{
if(!i_bReverse)
{
return i_rVal;
}
else
{
// here fast implementation
}
}
template <class T>
T ReverseBytes(T &i_rVal, bool i_bReverse)
{
if(!i_bReverse)
{
return i_rVal;
}
else
{
T rv = 0;
byte *pBytesSrc = reinterpret_cast<byte*>(&i_rVal);
byte *pBytesRet = reinterpret_cast<byte*>(&rv);
for (size_t i=0,j=sizeof(T)-1; i<sizeof(T); ++i, --j)
pBytesRet[j] = pBytesSrc[i];
return rv;
}
}
template<typename T>
T ReverseBytes (const void *i_pvBuffer, T &val)
{
return ReverseBytes (*(T*)i_pvBuffer, true);
}
Здравствуйте, flаt, Вы писали:
F>Здравствуйте, SVV, Вы писали:
SVV>>прошу подсказать как написать этот some_template
F>Там куча способов есть. Но смысла это не имеет: http://rsdn.ru/forum/cpp/5493412.1
для 2 и 4 байтных типов есть быстрая реализация без циклов. фиксированное количество операций. можно конечно писать специализированную функцию для каждого двухбайтного типа, но проще ориентироваться на sizeof(T) и неважно как называется тип (в коде много typedef)
для такого варианта не сильно понятно как шаблон делать. что-то я слабовал в шаблонах. сегодня перечитывал мейерса, про размерность матрицы в шаблоне, но сдается мне там не о том что мне надо речь шла...
template<typename T, size_t size>
class SquareMatrix: private SquareMatrixBase {
public:
SquareMatrix() // присвоить указателю на данные
:SquareMatrixBase<t>(n, 0), // в базовом классе значение null
pData(new T(n*n)) // выделить память для данных матрицы,
{this->setDataPtr(pData.get();} // сохранить указатель на нее и передать
... // его копию базовому классу private:
boost::scoped_array<T> pData; // о классе boost::scoped_array
}; //см. правило 13