【发布时间】:2020-06-21 21:42:27
【问题描述】:
我有 3 个函数模板特化,具有完全相同的代码。我已经尝试了一段时间,但我无法成功地将它们合并到一个模板表达式中。这是一个示例:
template <typename Event>
void aFunction(const Event &anEvent){
// do nothing for other types
}
template <>
void aFunction(const InsertEvent &anEvent){
std::cout<<"aFunction"<<std::endl;
}
template <>
void aFunction(const RemoveEvent &anEvent){
std::cout<<"aFunction"<<std::endl;
}
template <>
void aFunction(const ChangeEvent &anEvent){
std::cout<<"aFunction"<<std::endl;
}
编辑: 我尝试使用 std::enable_if_t 合并它们,并且我已经能够按如下方式进行:
template <typename Event>
typename std::enable_if_t<
!std::is_same<Event, InsertEvent>::value &&
!std::is_same<Event, RemoveEvent>::value &&
!std::is_same<Event, ChangeEvent>::value>
aFunction(const Event &anEvent){
// do nothing for other types
}
template <typename Event>
typename std::enable_if_t<
std::is_same<Event, InsertEvent>::value ||
std::is_same<Event, RemoveEvent>::value ||
std::is_same<Event, ChangeEvent>::value>
aFunction(const Event &anEvent){
std::cout<<"aFunction"<<std::endl;
}
相反,对于更一般的模板案例,是否可以去掉 !std::is_same<..> 行?
【问题讨论】:
-
你希望它在其他类型上“什么都不做”,但在其他类型的情况下出错?
-
对其他类型不做任何事情(SFINAE)
标签: c++ c++14 template-meta-programming