【发布时间】:2013-01-14 05:15:39
【问题描述】:
在模板元编程中,可以在返回类型上使用SFINAE来选择某个模板成员函数,即
template<int N> struct A {
int sum() const noexcept
{ return _sum<N-1>(); }
private:
int _data[N];
template<int I> typename std::enable_if< I,int>::type _sum() const noexcept
{ return _sum<I-1>() + _data[I]; }
template<int I> typename std::enable_if<!I,int>::type _sum() const noexcept
{ return _data[I]; }
};
但是,这不适用于构造函数。假设,我要声明构造函数
template<int N> struct A {
/* ... */
template<int otherN>
explicit(A<otherN> const&); // only sensible if otherN >= N
};
但不允许 otherN < N 使用它。
那么,可以在这里使用 SFINAE 吗?我只对允许自动模板参数推导的解决方案感兴趣,所以
A<4> a4{};
A<5> a5{};
A<6> a6{a4}; // doesn't compile
A<3> a3{a5}; // compiles and automatically finds the correct constructor
注意:这是一个非常简化的示例,其中 SFINAE 可能是多余的,static_assert 可能就足够了。但是,我想知道我是否可以改用 SFINAE。
【问题讨论】:
-
我们真的应该得到一个核心语言功能来取代这种 SFINAE 滥用,我认为一厢情愿......
-
请更正代码,让它按照你的意图去做
-
@JohannesSchaub-litb 我没有得到您的编辑/评论。
A<6> a6{a4};是(意味着)对我想使用 SFINAE 的类复制构造函数的调用。所以参数必须是一个类型,而不是A<4>::operator()的结果,就像你的A<6> a6(a4())一样。 -
@Walter 问题是 a4 和 a5 是函数。现在它已经修复了。
标签: c++ c++11 constructor sfinae