如何使用三元运算符有条件地初始化 const char* arr[]

Posted

技术标签:

【中文标题】如何使用三元运算符有条件地初始化 const char* arr[]【英文标题】:How to conditionally init const char* arr[] with ternary operator 【发布时间】:2022-01-15 01:12:57 【问题描述】:

TLDR;

如何有条件地初始化const char* []

const char* arr[] = (some_condition ? "ta", "ta" : "wo", "lo", "lu");

错误:“”标记(...)之前的预期主表达式 错误:在“”标记(...)之前应为“:” 错误:“”标记(...)之前的预期主表达式 错误:从‘char**’到‘const char**’的无效转换[-fpermissive]


详情

我正在使用以const char* argv[] 作为输入的外部 api。基于存储在更健全的数据结构中的变量,例如std::string,我构造了这个输入变量,但我显然无法正确地这样做。

说实话,问题的根源归结为一个可选的麻烦参数。以下作品(有点)..

bool use_optional = false;
std::string optional = "blah";

const char* arr[] = 
    "arg1",
    (use_optional ? optional.c_str() : ""),
    "arg3" 
;

这个解决方案的问题是我在arr 中得到一个空条目,即"arg1", "", "arg3",我非常想避免这种情况。

【问题讨论】:

由于需要在编译时知道数组的大小,因此您不能这样做。您需要动态分配一个数组(例如:通过std::vector<const char*> 条件表达式的结果表达式必须是同一类型。 感谢您的反馈,非常感谢。 【参考方案1】:

作为一种解决方法,您可以创建 2 个不同的数组,并在它们之间切换:

const char* arr1[] = "ta", "ta";
const char* arr2[] = "wo", "lo", "lu";
auto arr = some_condition ? arr1 : arr2;

另一种可能是使用向量:

std::vector<const char*> varr;
varr.push_back("arg1");
if (use_optional) varr.push_back(optional.c_str()),
varr.push_back("arg3");
auto arr = &varr[0];

【讨论】:

谢谢,那会奏效的!但是,args 的数量相当长且笨重,因此有点不切实际。不过,我真的很感激这个建议。 参考编辑;这很好用。谢谢!我现在看到这也是@UnholySheep 在他的评论中提到的。

以上是关于如何使用三元运算符有条件地初始化 const char* arr[]的主要内容,如果未能解决你的问题,请参考以下文章

这些在 React 中使用三元运算符有条件地应用内联样式的方法在性能上是不是有任何差异?

如何使用 ReactiveBase 有条件地呈现搜索结果

如何在python中编写三元条件运算符? [复制]

三元条件运算符中的多个条件?

如何在返回数组的return语句中使用三元运算符

如何使用三元运算符中的枚举检查两个条件?