如何通过给定的变体类型
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
包括所有算术类型V
和V2
包括所有非算术类型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) 对于给定的类,如果我想编写所有的比较运算符,为了避免代码重复,我会写这样的东西:
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()
.有区别吗?我应该选择哪个?
如果 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 中的“响应”并具有状态代码。
为什么在以下代码中将类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?
当我以 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 历史文件中。是否可以防止密码被保存?
为什么以下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'的模板参数无效,是预期的编译时常量表达式
我有
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的情况下进行搜索?
我在 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错误。
我有一个简单的序列化框架,它定义了各种类型的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的特化.例如,我可以用它做这样的事情.
给定变量类型:
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)