【发布时间】:2012-12-30 23:45:36
【问题描述】:
我想知道是否可以创建一个类来作为 std::enable_if 和 SFINAE 成员检测器之间的组合。
class foo
{
public:
int bar;
};
template <class T>
typename enable_if_has_bar<T>::type ReturnBar (const T& value)
{
return value.bar;
}
所以我尝试这样做。
class foo
{
public:
int bar;
};
template <class C, C>
class Check;
template <class T, class Enable = void>
class enable_if_has_bar
{};
template <class T>
class enable_if_has_bar<T, Check <decltype(&T::bar),&T::bar>>
{
public:
typedef decltype(static_cast<T*>(0)->*static_cast<decltype(&T::bar)>(0)) type;
};
template <class T>
typename enable_if_has_bar<T>::type ReturnBar (const T& value)
{
return value.bar;
}
int main ()
{
foo foobar;
foobar.bar = 42;
cout << ReturnBar(foobar) << endl;
}
它似乎不起作用,而且我对 SFINAE 的美术还不够精通。也许有人可以改进/修复它?因为我很茫然。
【问题讨论】:
-
不应该是
ReturnBar(foobar)和&T::bar吗?并不是说它即使在那时也能工作,但它会更接近工作。 -
哦,那里的错字很严重。谢谢
-
有趣的小玩笑:我将 SFINAE 发音为“SNIFNAE”(是的,有两个 n),所以听起来像“SNIF-NAY”。呵呵