【发布时间】:2021-08-25 18:01:30
【问题描述】:
我需要创建一个可以接受多种类型数据的向量。该向量将被转换为字符串并使用 SHA1 进行哈希处理。我尝试创建一个vector<boost::any> 并使用std::string(v.begin(), v.end()) 创建一个字符串,但这会导致...
/Users/yash/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1/string:2065:22: error: no matching member function for call to 'assign'
traits_type::assign(*__p, *__first);
~~~~~~~~~~~~~^~~~~~
/Users/yash/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1/string:2074:5: note: in instantiation of function template specialization 'std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >::__init<std::__ndk1::__wrap_iter<boost::any *> >' requested here
__init(__first, __last);
^
/Users/yash/BuildBox/GDBIAG15 android/EzNotes/app/src/main/cpp/Obfuscator.cpp:21:30: note: in instantiation of function template specialization 'std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> >::basic_string<std::__ndk1::__wrap_iter<boost::any *>, void>' requested here
salt = hashSaltUsingSHA1(std::string(v.begin(), v.end()));
^
/Users/yash/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1/__string:208:10: note: candidate function not viable: no known conversion from 'boost::any' to 'const std::__ndk1::char_traits<char>::char_type' (aka 'const char') for 2nd argument
void assign(char_type& __c1, const char_type& __c2) _NOEXCEPT {__c1 = __c2;}
^
/Users/yash/Library/Android/sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/darwin-x86_64/sysroot/usr/include/c++/v1/__string:227:30: note: candidate function not viable: requires 3 arguments, but 2 were provided
static inline char_type* assign(char_type* __s, size_t __n, char_type __a) _NOEXCEPT
^
1 error generated.
[2/3] Building CXX object CMakeFiles/native-lib.dir/native-lib.cpp.o
ninja: build stopped: subcommand failed.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
编辑:对我正在尝试做的事情进行更清晰的定义。以一个字符串的形式获取多个复杂对象的原始数据,并用SHA1进行hash
【问题讨论】:
-
std::string不知道如何将boost::any转换为字符数据。大多数情况下,尝试使用any类型进行类型双关是行不通的,因为无法恢复对象的原始类型。您需要为自己包含一个机制,这不是一件容易的事。 -
如果“多种类型的数据”是指“从公共基础派生的类,具有虚拟接口”,那么我认为应该很简单。如果没有,我看不到该怎么做。
-
我需要创建一个可以接受多种类型数据的向量假设您知道哪些类型,
std::variant可能是一个更好的主意。它可能不会立即解决您的具体问题,但可能会让事情变得更容易。 -
您是否尝试过将所有内容强制转换为 void* 并保留一个单独的向量来恢复类型(或者可能是一个 std::pair 或具有类型字段和数据字段的小型结构作为一个无效*)?
-
你需要保留你读入的所有对象吗?哈希函数和 SHA1 可以设计为加法(添加更多数据)。您不需要存储所有对象,每个对象一个实例就足够了。
标签: c++ cmake android-ndk