tuple-get_or辅助函数
tuple - get_or helper function
我需要一个元组助手函数,如果元组中不存在请求的类型,它将返回默认构造的null类型。
例如
std::tuple<bool, int> tuple(true, 0);
static_assert(std::is_same<decltype(get_or<double, std::nullptr_t>(tuple)),
std::nullptr_t>::value, "");
assert(get_or<double, std::nullptr_t>(tuple) == nullptr);
我想我需要一些助推融合魔法,但我还没有完全弄清楚。有什么建议吗?
这里有一个tuple_index
助手,它返回std::tuple
中给定类型的索引。(可以很容易地将其调整为使用谓词(如is_convertible
)
template< typename elem, typename tup, std::size_t offset = 0 >
struct tuple_index
: std::integral_constant< std::size_t, offset > {};
template< typename elem, typename head, typename ... tail, std::size_t offset >
struct tuple_index< elem, std::tuple< head, tail ... >, offset >
: std::integral_constant< std::size_t, tuple_index< elem, std::tuple< tail ... >, offset + 1 >::value > {};
template< typename elem, typename ... tail, std::size_t offset >
struct tuple_index< elem, std::tuple< elem, tail ... >, offset >
: std::integral_constant< std::size_t, offset > {};
你可以这样构建:
template< typename result, typename fallback, typename tuple >
typename std::enable_if< tuple_index< result, typename std::decay< tuple >::type >::value
== std::tuple_size< typename std::decay< tuple >::type >::value,
fallback >::type
get_or( tuple && t ) { return {}; }
template< typename result, typename fallback, typename tuple >
typename std::enable_if< tuple_index< result, typename std::decay< tuple >::type >::value
!= std::tuple_size< typename std::decay< tuple >::type >::value,
result >::type
get_or( tuple && t ) {
return std::get< tuple_index< result, typename std::decay< tuple >::type >::value >
( std::forward< tuple >( t ) );
}
http://ideone.com/ZdoWI7
所有的CCD_ 4都是必要的,因为元函数在tuple
和tuple &
之间进行区分。
相关文章:
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 瓦尔格林德:数学函数"Conditional jump or move depends on uninitialised value(s)"
- emplace_back和push_back给出错误'double free or corruption (fasttop)'尽管定义了复制和移动构造函数
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 我应该使用 const shared_ptr<T>&or shared_ptr<T> 作为我的 lambda 函数的参数吗?
- 按位函数 AND、OR 和 XOR 在 C++ 中使用十六进制字符串
- C++中的友元函数显示"variable or feild declared void error"
- 子构造函数无法识别基类的成员:平均值,西格玛"is not a nonstatic data member or base class"
- 显式调用析构函数时的 C++ 内存错误 ("double free or corruption"
- 尾随 const&or && on 函数声明
- 当 0 或 NULL 通过模板间接传递给共享指针(shared_ptr OR unique_ptr)时,调用函数失败
- void 函数导致编译器错误"variable or field ‘funcName’ declared void"
- 等效于 VB DLL 函数声明的 C# 返回并返回'Attempted to read or write protected memory'错误
- 尝试定义一个函数,但我得到了"variable or field `function_A' declared void"
- 函数声明错误,"expected constructor, destructor, or type conversion before ';' token"
- 函数和变量"chicken or the egg"方案