仅初始化c++11元组的第一个参数
Initialize only first argument of c++11 tuple
最小工作示例:
#include <tuple>
struct example
{
example(int, char) {}
};
int main()
{
std::tuple<example, int, double>
my_tuple(example(0, 'x'), 42, .0);
// std::tuple t = make_my_tuple(0, 'x');
return 0;
}
这是有效的。
有没有一种更优雅的方法可以像我在评论中画的那样只初始化第一个成员?一个只使用参数来构造第一个元组成员而不初始化其他元组成员的元组?
我问的原因是什么?我只是对语言的语义感兴趣。
你说没有必要为其他两个成员赋值——你担心性能吗?或者这些成员可能没有合适的价值?
如果是后者,您可以让元组持有boost::optionals。例如
#include <tuple>
#include <boost/optional.hpp>
using namespace boost;
struct example
{
example(int, char) {}
};
typedef std::tuple<example, optional<int>, optional<double>> MyTuple;
int main()
{
MyTuple my_tuple(example(0, 'x'), optional<int>(), optional<double>());
return 0;
}
现在,在语义上,int和float是"未初始化的",并且可以查询它们的值。
为了使其更优雅,您可以将其封装到一个函数中,使用完美的参数转发习惯用法(通常情况下,在这种情况下,您的参数复制成本很低,因此这样做不会带来任何速度优势):
template <class... Args>
MyTuple make_mytuple(Args&&... args)
{
return MyTuple(example(std::forward<Args>(args)...), optional<int>(), optional<double));
}
这个模板的优点是它对示例构造函数的更改具有弹性。如果您添加了另一个参数,只需使用新的参数调用make_mytuple即可。
您关于元组结构中的复制的另一点是有效的,但实际上我相信这对大多数编译器来说都是最佳的。(通过值将右值传递给函数时,RVO和副本省略的组合)。
您可以使用统一初始化。遗憾的是,您无法定义默认值,参数将使用默认构造函数或0初始化。
#include <iostream>
#include <tuple>
enum class Result {Full, Partial, Empty};
std::tuple<bool, int, double> get_tuple(Result type)
{
if (type == Result::Full)
return {true, 42, 3.14159};
else if (type == Result::Partial)
return {true, 42, {}};
else
return {};
}
int main()
{
bool b;
int i;
double d;
std::tie(b, i, d) = get_tuple(Result::Full);
std::cout << b << " " << i << " " << d << std::endl;
std::tie(b, i, d) = get_tuple(Result::Partial);
std::cout << b << " " << i << " " << d << std::endl;
std::tie(b, i, d) = get_tuple(Result::Empty);
std::cout << b << " " << i << " " << d << std::endl;
return 0;
}
输出:
1 42 3.14159
1 42 0
0 0 0
相关文章:
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 可变参数模板作为第一个参数
- 如何从第一个参数推断第二个参数类型?
- 候选构造函数(隐式复制构造函数)不可行:第一个参数需要 l 值
- 为什么 std::error_code 构造函数的第一个参数固定为 int
- 如何通过 std::apply 调用具有定义的第一个参数的可变参数模板函数?
- 如何获取指向 qsort 第一个参数的向量中第一项的指针?
- 如何在 Lua 回调中检测可选的第一个参数
- 如何让我的 strchr 函数同时将'const char'数组和'char'数组作为第一个参数?
- 在第一个参数上部分专用化模板
- 模板的C 功能将第一个参数设置为第二个参数为默认参数
- 如何获取指向函数第一个参数的指针
- 我可以使用use_lazy_terminal对获得3个参数懒惰的终端的第一个参数
- C++比较运算符重载中第一个参数为 null 时出现分段错误
- Cc 套接字编程 select() 的第一个参数
- 重载运算符:第一个参数对应左操作数,第二个参数对应右操作数
- 仅初始化c++11元组的第一个参数
- 我可以使用成员函数作为EnumWindows的第一个参数吗
- gdb只接受第一个参数
- 等键在 boost::unordered_multimap 中起作用:查询键是否保证是第一个参数