Если обрабатывать строки как байты - это больше, вы можете использовать следующие функции
function u_atob(ascii) {
return Uint8Array.from(atob(ascii), c => c.charCodeAt(0));
}
function u_btoa(buffer) {
var binary = [];
var bytes = new Uint8Array(buffer);
for (var i = 0, il = bytes.byteLength; i < il; i++) {
binary.push(String.fromCharCode(bytes[i]));
}
return btoa(binary.join(''));
}
// example, it works also with astral plane characters such as '
Попробуйте скомпилировать приведенный ниже код
template<void>
void foo(){}
Я получил ошибку компилятора 'void' не является допустимым типом для параметра шаблона нетипичного типа .
В качестве параметра шаблона вы можете передать:
1) type , затем вы объявляете его, используя class / typename, как показано ниже:
template< class/typename A[optional] = void>
void foo2(){}
2) non-type , затем вы можете передать в качестве параметра шаблона некоторое значение типа intergers, указатели, ссылку на Lvalue и т. Д. (Полный список здесь )
template<void*>
void foo3(){}
3) тип шаблона параметр
В вашем примере is_nothrow_move_constructible
возвращает значение true для A
, затем компилятор встречает строку:
template <typename U = T, enable_if_t<is_nothrow_move_constructible<U>{}>>
что такое:
template <typename U = T, void>
эта строка имеет неверную синтаксис, и компилятор удаляет этот шаблон функции-члена из набора перегрузок. Вы можете исправить это, объявив enable_if_t<is_nothrow_move_constructible<U>{}
как параметр типа:
template <typename U = T,
typename = enable_if_t<is_nothrow_move_constructible<U>{}> > // typename = void
void realloc_impl(priority_tag<2> pr)
{
cout << "nothrow move \n";
};
или как нетипичный (указатель на void), что вы сделали в своем примере.