gpt4 book ai didi

c++ - 如何避免从整数 0 到指针的隐式转换,作为 vector 的元素

转载 作者:行者123 更新时间:2023-12-01 11:57:45 24 4
gpt4 key购买 nike

有一种情况,我想收集 JSON 中一个键的路径的所有节点名称。考虑条件:JSON 数组索引“0”、“1”也是允许的,但是很容易忘记引号,这会导致在取消引用时崩溃。所以我希望编译器拒绝这种参数。例子:

#include <vector>
#include <iostream>

int func(const std::vector<const char*>& pin) {
return pin.size();
}

int main() {
// {"aname", "3", "path", "0"} wanted but this still compile
std::cout << func({"aname", "3", "path", 0}) << std::endl;
}
引用 How do I avoid implicit conversions on non-constructing functions?我尝试了以下内容:
#include <vector>
#include <iostream>

int func(const std::vector<const char*>& pin) {
return pin.size();
}

int func(const std::vector<int>& pin) = delete;
// or
/* I want to describe only pointer type parameter is allowed as element,
but parameter of any integer types is rejected. */
template<typename T>
int func(const std::vector<T>& pin) = delete;

int main() {
std::cout << func({"aname", "3", "path", 0}) << std::endl;
}
但是编译器还是不能理解我。
有什么建议吗?
请指出任何滥用术语和假设的地方,谢谢!

最佳答案

像这样的东西?它与您建议的重载解决方案非常相似,但需要包装 vector 类型。如果您提供文字 0,则无法构建因为选择了删除的构造函数重载。

#include <memory>
#include <new>
#include <vector>
#include <iostream>
using std::vector;

template<typename T>
struct no_zero {
no_zero(T val) : val(val) {}
no_zero(int val) = delete;
operator T() { return val; }
T val;
};

int func(const vector<no_zero<const char*> >& pin) {
return pin.size();
}

int main() {
// {"aname", "3", "path", "0"} wanted but this still compile
std::cout << func({"aname", "3", "path", 0}) << std::endl;
}

关于c++ - 如何避免从整数 0 到指针的隐式转换,作为 vector 的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61243176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com