假设存在一个定义如下的变体 v:
std::variant<int,char,double,bool,std::string> v;
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 std::visit 或 std::get 从 std::variant 获取基础值。
我试着天真地这样做:
constexpr size_t idx = v.index();
auto k = std::get<idx>(v);
Run Code Online (Sandbox Code Playgroud)
但是后来了解到,如果变体 v 本身不是 constexpr,这将失败。即便如此,使用 std::string 也可能存在问题(由于 std::string 的析构函数的定义)。
我的第二次尝试是尝试执行以下操作:
auto k = std::visit([](auto arg){return arg;}, v);
Run Code Online (Sandbox Code Playgroud)
但是收到了这个:
$g++ -o main *.cpp --std=c++17
In file included from main.cpp:5:0:
/usr/include/c++/7/variant: In instantiation of ‘static constexpr auto std::__detail::__variant::__gen_vtable_impl<std::__detail::__variant::_Multi_array<_Result_type (*)(_Visitor, _Variants ...)>, std::tuple<_Tail ...>, std::integer_sequence<long unsigned int, __indices ...> >::_S_apply() [with _Result_type = int; _Visitor = main()::<lambda(auto:1)>&&; _Variants = {std::variant<int, char, double, bool, …Run Code Online (Sandbox Code Playgroud) 考虑以下代码:
#include <any>
struct A {
A();
A(const A&) = default;
explicit A(std::any value);
};
struct B: A {
B() : A() { }
B(const B& b) : A(b) {}
explicit B(std::any value) : A(value) {}
};
Run Code Online (Sandbox Code Playgroud)
编译器在编译时报告以下错误(使用 clang++-5 或更高版本):
In file included from <source>:2:
In file included from /opt/compiler-explorer/gcc-7.3.0/lib/gcc/x86_64-linux-gnu/7.3.0/../../../../include/c++/7.3.0/any:37:
In file included from /opt/compiler-explorer/gcc-7.3.0/lib/gcc/x86_64-linux-gnu/7.3.0/../../../../include/c++/7.3.0/new:40:
In file included from /opt/compiler-explorer/gcc-7.3.0/lib/gcc/x86_64-linux-gnu/7.3.0/../../../../include/c++/7.3.0/exception:143:
In file included from /opt/compiler-explorer/gcc-7.3.0/lib/gcc/x86_64-linux-gnu/7.3.0/../../../../include/c++/7.3.0/bits/nested_exception.h:40:
In file included from /opt/compiler-explorer/gcc-7.3.0/lib/gcc/x86_64-linux-gnu/7.3.0/../../../../include/c++/7.3.0/bits/move.h:54:
/opt/compiler-explorer/gcc-7.3.0/lib/gcc/x86_64-linux-gnu/7.3.0/../../../../include/c++/7.3.0/type_traits:149:31: error: no member named 'value' in 'std::is_copy_constructible<B>'
: public …Run Code Online (Sandbox Code Playgroud) 我不明白为什么我无法使用 LoadLibrary 加载我的 dll“接口”。加载依赖项时似乎失败了,但我不确定为什么。
这是代码:
AfxMessageBox(L"before load library");
HMODULE interfacDll = LoadLibrary(TEXT("C:\\QA\\Pcdlrn\\Win32\\Release\\INTERFAC.DLL"));
if (!interfacDll)
DWORD dw = GetLastError(); // returns 0xc1 (193)
AfxMessageBox(L"after load library");
Run Code Online (Sandbox Code Playgroud)
这是 gflags (x86) 加载器快照的输出:
18a0:2a40 @ 06858973 - LdrGetDllHandleEx - ENTER: DLL name: ntdll.dll DLL path: NULL
18a0:2a40 @ 06858973 - LdrGetDllHandleEx - INFO: Locating DLL ntdll.dll in path C:\QA\Pcdlrn\CNCSERVER\Win32\Release;C:\Windows\system32;C:\Windows\system;C:\Windows;C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\NativeBinaries\x86;C:\windows\system32;C:\windows;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows
18a0:2a40 @ 06858989 - LdrpFindLoadedDll - ENTER: DLL name: ntdll.dll DLL …Run Code Online (Sandbox Code Playgroud) 我试图理解以下代码的结果:
template<typename KeyTypeT, typename ValueTypeT>
class MapWrapper {
std::any _container;
MapWrapper() {
_container = std::map<KeyTypeT, ValueTypeT>();
}
void insert(KeyTypeT key, ValueTypeT value) {
auto originalMap = std::any_cast<std::map<KeyTypeT, ValueTypeT>>(_container);
std::cout << "count is " << originalMap.size() << std::endl;
auto afterInsertion = std::any_cast<std::map<KeyTypeT, ValueTypeT>>(_container);
afterInsertion.insert(std::make_pair(key, value));
std::cout << "count is " << afterInsertion.size() << std::endl;
auto originalMapAfterInsertion = std::any_cast<std::map<KeyTypeT, ValueTypeT>>(_container);
std::cout << "count is " << originalMapAfterInsertion.size() << std::endl;
_container = afterInsertion;
auto originalMapAfterAssignement = std::any_cast<std::map<KeyTypeT, ValueTypeT>>(_container);
std::cout << "count is " …Run Code Online (Sandbox Code Playgroud) 在尝试编译一个类时,我继续崩溃gcc(由于内存不足),该类使用在我的类的相应.h文件中定义的许多函数模板.当我开始编译该cpp文件时,我有6.4GB的可用内存:
$ free -mh
total used free shared buff/cache available
Mem: 9.7G 3.1G 6.5G 260K 212M 6.4G
Swap: 947M 887M 59M
Run Code Online (Sandbox Code Playgroud)
这是gcc的详细信息:
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-16ubuntu3' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --with-as=/usr/bin/x86_64-linux-gnu-as --with-ld=/usr/bin/x86_64-linux-gnu-ld --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu …Run Code Online (Sandbox Code Playgroud)