小编Ale*_*sky的帖子

按给定条件拆分给定 std::variant 类型

如何通过给定的变体类型

using V = std::variant<bool, char, std::string, int, float, double, std::vector<int>>;
Run Code Online (Sandbox Code Playgroud)

声明两种变体类型

using V1 = std::variant<bool, char, int, float, double>;
using V2 = std::variant<std::string, std::vector<int>>;
Run Code Online (Sandbox Code Playgroud)

whereV1包括所有算术类型VV2包括所有非算术类型V

V 可以是模板类的参数,例如:

template <class V>
struct TheAnswer
{
    using V1 = ?;
    using V2 = ?;
};
Run Code Online (Sandbox Code Playgroud)

一般来说,标准可以是这样的constexpr变量:

template <class T>
constexpr bool filter;
Run Code Online (Sandbox Code Playgroud)

c++ c++17 std-variant

20
推荐指数
2
解决办法
650
查看次数

std :: tie和std :: forward_as_tuple之间有什么区别

对于给定的类,如果我想编写所有的比较运算符,为了避免代码重复,我会写这样的东西:

class B {
public:
    bool operator==(Type const& rhs) const {
        return as_tuple() == rhs.as_tuple();
    }

    bool operator!=(Type const& rhs) const {
        return as_tuple() != rhs.as_tuple();
    }

    // .. and same for other operators ..

private:
    auto as_tuple() const {
        return std::tie(a, b, c); // all the members
    }
};
Run Code Online (Sandbox Code Playgroud)

我可以as_tuple()在那里实现,std::tie()或者我可以实现它std::forward_as_tuple().有区别吗?我应该选择哪个?

c++ c++14

9
推荐指数
1
解决办法
547
查看次数

如果 axios 请求失败,则 error.response 未定义

如果 Vue.js 应用程序中的 axios 请求失败,我将无法访问错误(响应)状态代码。我无法弄清楚为什么在“.catch”和“axios.interceptors.response”中都未定义响应。我遵循了这条说明,该说明表明可以使用如下代码轻松访问“error.response”:

axios.interceptors.response.use(
  (response) => { 
    console.log(response);
    return response;
  },  
  (error) => {
    handleApiFail(error.response);
  });
Run Code Online (Sandbox Code Playgroud)

如果我将此代码添加到我的应用程序中的“main.js”,则在请求失败时会调用“handleApiFail”,但第二个 lambda 中未定义 error.response 并且未调用第一个 lambda。如果请求成功,则定义第一个 lambda 中的“响应”并具有状态代码。

EDIT1不是一个选项,因为我的 OPTIONS 请求不需要授权。还有各种帖子描述了相同的情况。

axios

9
推荐指数
2
解决办法
2万
查看次数

没有operator ==()的类的对象将转换为另一种类型

为什么在以下代码中将类A的对象转换为bool(或int):

class A
{
public:

    operator bool() const { return true; }
    operator int() const { return 1; }
};

int main()
{
    return A() == A();
}
Run Code Online (Sandbox Code Playgroud)

目前还不清楚他们转变成了什么?bool或int?

c++ c++17

8
推荐指数
1
解决办法
150
查看次数

以不将其值保存到 bash 历史记录中的方式设置环境变量(密码)

当我以 root 身份登录 MySQL 时,我通常设置 MROOTPASS 环境变量

export MROOTPASS=my-secret-password
Run Code Online (Sandbox Code Playgroud)

然后做

mysql -u root -p$MROOTPASS
Run Code Online (Sandbox Code Playgroud)

这消除了每次我以 root 身份连接到 MySQL 时重新输入密码的需要,但显然它是不安全的,因为密码已保存到 bash 历史文件中。是否可以防止密码被保存?

bash

8
推荐指数
2
解决办法
3207
查看次数

如果count()是constexpr函数,为什么std :: array <int,count()>不能编译?

为什么以下C++代码无法用VC2017编译?

struct FixedMatchResults
{
    static constexpr std::size_t count() { return 20; };

    std::array<int, count()> results;
};
Run Code Online (Sandbox Code Playgroud)

错误是:

错误C2975:'_ Size':'std :: array'的模板参数无效,是预期的编译时常量表达式

c++ visual-c++

7
推荐指数
0
解决办法
257
查看次数

如何在std :: unordered_map <std :: wstring,T>中通过类型为std :: wstring_view的键找到?

我有

std::unordered_map<std::wstring, std::vector<unsigned>> map;
Run Code Online (Sandbox Code Playgroud)

当我尝试

map.find("asdf"sv)
Run Code Online (Sandbox Code Playgroud)

我明白了

error C2664: 'std::_List_const_iterator<std::_List_val<std::_List_simple_types<_Ty>>> std::_Hash<std::_Umap_traits<_Kty,std::vector<unsigned int,std::allocator<unsigned int>>,std::_Uhash_compare<_Kty,_Hasher,_Keyeq>,_Alloc,false>>::find(const std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &) const': cannot convert argument 1 from 'std::wstring_view' to 'const std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>> &'
Run Code Online (Sandbox Code Playgroud)

有没有可能使用std :: wstring_view编译map.find()或至少在不构造std :: wstring的情况下进行搜索?

c++ c++17

7
推荐指数
1
解决办法
316
查看次数

成为 docker 容器的 root

在 Docker 容器中安装了Oracle 数据库,但不知道如何成为 root。如果我从主机到这个

sudo docker exec -it -u 0 oracle18se /bin/bash
Run Code Online (Sandbox Code Playgroud)

或者

sudo docker exec -it --user root oracle18se /bin/bash
Run Code Online (Sandbox Code Playgroud)

我得到

OCI runtime exec failed: exec failed: container_linux.go:345: starting container process caused "chdir to cwd (\"/home/oracle\") set in config.json failed: permission denied": unknown
Run Code Online (Sandbox Code Playgroud)

如果我做

sudo docker exec -it oracle18se /bin/bash
Run Code Online (Sandbox Code Playgroud)

从主机,然后

su -
Run Code Online (Sandbox Code Playgroud)

从容器中,它询问 root 密码,但我不知道。

Hy 主机操作系统是 Ubuntu 18.04,链接到 docker 文件

编辑1:

发现一个 Docker错误

docker

7
推荐指数
2
解决办法
5832
查看次数

确定是否为特定类型的参数定义了重载函数

我有一个简单的序列化框架,它定义了各种类型的Read和Write模板函数的特化,包括算术,我的类和std容器,如vector,array,map等,所以有可能这样做

std::vector<std::string> v{ "a1", "b123", "c12345" };
Read(stream, v);
Write(stream, v);
Run Code Online (Sandbox Code Playgroud)

要么

std::map<int, MyClass> m;
Read(stream, m);
Write(stream, m);
Run Code Online (Sandbox Code Playgroud)

, 例如.

我正在寻找一种方法来确定在编译时是否可序列化类型,通过实现这样的事情:

template <class T>
constexpr bool is_serializable()
{
    if (Read<T> and Write<T> are defined) 
        return true;
    return false;
}
Run Code Online (Sandbox Code Playgroud)

或者可能是别的东西.

可能吗?

读写的声明:

    template <typename T>
    void Read(InputStream & s, T & val);

    template <typename T>
    void Write(OutputStream & s, T val);
Run Code Online (Sandbox Code Playgroud)

从理论上讲,除了Read和Write之外,我还可以为我需要的每种类型定义is_serializable,但这需要更多的输入并使代码更复杂,因此自动定义is_serializable是更优雅的方式.

它也可以是一些具有读写功能的Serializer模板类作为成员.在这种情况下,我需要知道是否有针对特定类型的Serializer的特化.例如,我可以用它做这样的事情.

c++ c++17

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

获取一个std :: tuple元素作为std :: variant

给定变量类型:

using Variant = std::variant<bool, char, int, float, double, std::string>;
Run Code Online (Sandbox Code Playgroud)

和一个元组类型,其中包含限于该变量类型的元素(可能有重复和省略,但不能有其他类型):

using Tuple = std::tuple<char, int, int, double, std::string>;
Run Code Online (Sandbox Code Playgroud)

如何在运行时实现通过给定索引获取和设置元组元素的方法为Variant的方法:

Variant Get(const Tuple & val, size_t index);
void Set(Tuple & val, size_t index, const Variant & elem_v);
Run Code Online (Sandbox Code Playgroud)

我的代码中有两个实现,但我有一个更好的印象。我的第一个实现使用std::function第二个构建一个由一些Accessor指针组成的数组,这些指针对移动和复制对象施加了限制(因为它的地址更改了)。我想知道是否有人知道实现此目标的正确方法。

编辑1:

以下示例可能阐明了我的意思:

Tuple t = std::make_tuple(1, 2, 3, 5.0 "abc");
Variant v = Get(t, 1);
assert(std::get<int>(v) == 2);
Set(t, 5, Variant("xyz"));
assert(std::get<5>(t) == std::string("xyz"));
Run Code Online (Sandbox Code Playgroud)

c++ c++17

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

标签 统计

c++ ×7

c++17 ×5

axios ×1

bash ×1

c++14 ×1

docker ×1

std-variant ×1

visual-c++ ×1