标签调度/enable_if - 我很困惑
Tag dispatching/enable_if - I am confused
我有以下结构:
struct A
{
}
struct B
{
tuple<string,string> children{{"test1","test2"}};
}
我想创建一个模板函数,该函数将在具有称为 child 的成员变量的每个类上重载 <<运算符。如果可能 - 仅在名为子级的元组上。
当遇到具有像 B 这样的子元组的类时,它应该迭代元组成员并调用每个元组成员<<。
像这样:
template<typename RECEIVERTYPE,typename SENDERTYPE>
typename std::enable_if<std::have_children_member<RECEIVER_TYPE>::value, void>::type
RECEIVERTYPE& operator<< (RECEIVERTYPE& streamReceiver, const SENDERTYPE& streamSender)
{
for_each(streamSender.children, [&](const auto& child)
{
streamReceiver << child;
});
return streamReceiver;
}
我尝试了很多例子 - 但我无法真正在Visual Studio 2015中工作。
我这样做只是为了仅将类型与名为 children
的元组成员匹配:
template<typename S, typename T,
std::size_t = std::tuple_size<decltype(T::children)>::value>
S& operator<<(S& s, const T& t)
{ ... }
并可能像这样实现正文:
template<typename S, typename T, std::size_t... I>
void
print_tuple_like(S& s, const T& t, std::index_sequence<I...>)
{
void* unused[] = { &(s << std::get<I>(t))... };
}
template<typename S, typename T,
std::size_t N = std::tuple_size<decltype(T::children)>::value>
S& operator<<(S& s, const T& t)
{
print_tuple_like(s, t.children, std::make_index_sequence<N>{});
return s;
}
或者像:
template<std::size_t N, typename S, typename T>
void
print_tuple_like(S& s, const T& t, std::false_type)
{ }
template<std::size_t N, typename S, typename T>
void
print_tuple_like(S& s, const T& t, std::true_type)
{
s << std::get<N>(t);
print_tuple_like<N+1>(s, t, std::integral_constant<bool, (N+1 < std::tuple_size<T>::value)>{});
}
template<typename S, typename T,
std::size_t N = std::tuple_size<decltype(T::children)>::value>
S& operator<<(S& s, const T& t)
{
print_tuple_like<0>(s, t.children, std::integral_constant<bool, (N != 0)>{});
return s;
}
相关文章:
- 如何在c++中实现处理器调度模拟器
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 我似乎对if/else的基本语句有问题:/
- if数组上的随机数
- 将按位if条件转换为普通if条件
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 使用if-else将数字转换为单词
- 为什么简单的算术减法在"if"条件下不起作用?
- 避免在字符串中分支 if-else 以类型调度