Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译时间将wchar缩小为char_C++_Visual C++_C++17_Compile Time - Fatal编程技术网

C++ 编译时间将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

在编译时函数中,我希望使用字符串。ANSI和WIDE都有。因此,我添加了一个快速模板来处理这两个问题。这很简单,但我有一个特殊的函数,它计算字符串的安全校验和。这可以在字节数组上工作,重写要在可变缓冲区大小上工作需要相当大的努力,所以我想我只需要将wchar缩小到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);
}