小编mar*_*f78的帖子

尝试使用 std::visit 和 lambda 表达式从 std::variant 返回值

假设存在一个定义如下的变体 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)

c++ c++17

6
推荐指数
2
解决办法
9344
查看次数

尝试在具有 std::any 构造函数的基类中调用复制构造函数时出现问题

考虑以下代码:

#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)

c++ clang++ c++17

6
推荐指数
1
解决办法
163
查看次数

LoadLibrary 失败,错误代码 193

我不明白为什么我无法使用 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)

c++ windows dll winapi loadlibrary

5
推荐指数
1
解决办法
3万
查看次数

使用存储在std :: any中的std :: map,然后通过std :: any_cast访问

我试图理解以下代码的结果:

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)

c++ c++17

3
推荐指数
1
解决办法
79
查看次数

如何避免由于内存不足导致的gcc崩溃

在尝试编译一个类时,我继续崩溃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)

c++ gcc templates g++

0
推荐指数
1
解决办法
657
查看次数

标签 统计

c++ ×5

c++17 ×3

clang++ ×1

dll ×1

g++ ×1

gcc ×1

loadlibrary ×1

templates ×1

winapi ×1

windows ×1