【发布时间】:2016-10-22 20:27:16
【问题描述】:
我正在尝试制作一个函数 X,该函数在提供成员函数 Y 时专门化,如果未提供成员函数 Y,则函数 X 使用全局非成员函数 Y 来实现相同的效果。
我目前正在尝试使用以下代码实现此目的
template <typename Container, typename std::enable_if_t<std::is_same<
decltype(std::declval<Container>().y()),
decltype(std::declval<Container>().y())>::value>* = nullptr>
void do_something(Container&& container) {
return std::forward<Container>().y();
}
template <typename Container, typename std::enable_if_t<!std::is_same<
decltype(std::declval<Container>().y()),
decltype(std::declval<Container>().y())>::value>* = nullptr>
void do_something(Container&& container) {
return y(std::forward<Container>(container);
}
但是在容器同时具有成员函数 y 和全局非成员函数 y 的情况下,它也可以工作。存在编译错误,因为对于该函数的第二个版本,模板参数格式不正确,因为需要成员函数 y。
知道如何解决这个问题吗?
注意:这与仅检测类是否具有给定签名的功能不同。对不起,如果问题似乎在问这个问题!下面接受的答案应该让我的意图更清楚。
【问题讨论】:
-
@bolov 我编辑了我的问题并添加了一条注释。下面巴里的回答澄清了我想问的问题!
标签: c++ c++11 templates template-specialization sfinae