C++ 编译时间将wchar缩小为char
在编译时函数中,我希望使用字符串。ANSI和WIDE都有。因此,我添加了一个快速模板来处理这两个问题。这很简单,但我有一个特殊的函数,它计算字符串的安全校验和。这可以在字节数组上工作,重写要在可变缓冲区大小上工作需要相当大的努力,所以我想我只需要将wchar缩小到char,让我的函数处理它。默认情况下,它不会像我想的那样工作 重现我的问题的示例代码:C++ 编译时间将wchar缩小为char,c++,visual-c++,c++17,compile-time,C++,Visual C++,C++17,Compile Time,在编译时函数中,我希望使用字符串。ANSI和WIDE都有。因此,我添加了一个快速模板来处理这两个问题。这很简单,但我有一个特殊的函数,它计算字符串的安全校验和。这可以在字节数组上工作,重写要在可变缓冲区大小上工作需要相当大的努力,所以我想我只需要将wchar缩小到char,让我的函数处理它。默认情况下,它不会像我想的那样工作 重现我的问题的示例代码: #包括 constexpr void hack(const char*const from,const size\t from len,char
#包括
constexpr void hack(const char*const from,const size\t from len,char*const to)
{
对于(大小i=0;i
如果您对宽字符串进行注释,它将完美地编译。有没有可能做我想做的事情,或者我真的应该重做我所有的算法来处理可变大小的问题?代码中的基本问题是,你不能使用
static\u cast
在指向不同数据类型的指针之间进行转换-当这些类型不相关时,就像char
和wchar\u t
一样;为此,您需要一个重新解释\u cast
或C
样式的cast:
constexpr加密存储(const U*输入)
{
hack(重新解释转换(输入),长度*大小(U),重新解释转换(m_数据));
}
但是,一旦您进行了这样的强制转换,您的EncyptedStorage
函数将无法在编译时进行计算,因此main
中的两个constepr
声明将失败,您只需使用const
:
const自动加密=加密存储(测试);
const auto-wencrypted=加密存储(wtest);//无法使用constexpr
编辑:
另一种方法(也许更好)是使用函数样式转换:
使用pcchar=const char*const;
使用pchar=char*const;
constexpr EncryptedStorage(const U*输入)
{
hack(pcchar(输入)、长度*大小f(U)、pchar(m_数据));
}
有了它,您可以将
constepr
用于加密
,但不能用于wencrypted
为什么不将wchar\u t
字符串视为字节数组,并计算其校验和呢?这正是我想要做的,但这迟早需要缩小某个范围。我的意思是,根据我的知识,你必须将wchar*转换为char*。不需要缩小范围,除非你想将wchar\t
字符转换为char
。只需强制转换到const char*
,您就有一个指向字节缓冲区的指针。我可能错了,但在我的示例代码中,我正试图这样做,但编译失败。你能检查一下吗?我想在编译时做,所以简单地删除constexpr对我来说不是一个选项。
#include <iostream>
constexpr void hack(const char* const from, const size_t fromLen, char* const to)
{
for (size_t i = 0; i < fromLen; i++)
{
to[i] = from[i] + 1;
}
}
template <typename U, std::size_t LENGTH>
class EncryptedStorage
{
U m_data[LENGTH]{};
public:
constexpr EncryptedStorage(const U* input)
{
hack(static_cast<const char* const>(input), LENGTH * sizeof(U), static_cast<char* const>(m_data));
}
};
int main()
{
// Test with CHAR
constexpr char test[] = "Hello World";
constexpr size_t size = sizeof(test) / sizeof(test[0]);
constexpr auto encrypted = EncryptedStorage<char, size>(test);
// test with WCHAR
constexpr wchar_t wtest[] = L"Hello World";
constexpr size_t wsize = sizeof(wtest) / sizeof(wtest[0]);
constexpr auto wencrypted = EncryptedStorage<wchar_t, wsize>(wtest);
}