当type包含具有给定名称和类型的静态变量时,enable_if函数

时间:2013-10-22 16:28:16

标签: c++ templates c++11 decltype enable-if

我正在尝试使用标题中描述的内容。

template <class T>
void foo(const Foo* f) // this is general case template
{

}

// this should work only if T has static variable named _Foo with type const Foo*
template <class T>
typename std::enable_if<std::is_same<decltype(T::_Foo), const Foo*>::value>::type 
  foo(const Foo* f)
{
  T::_Foo = f;
} 

但它无法编译:

error C2039: 'type' : is not a member of 'std::enable_if<false,void>'

如果enable_if失败,它不应该默认为第一个实现吗?我的意思是我在这里缺少什么,有人可以向我解释什么是错的,可能是什么解决方案。 (我觉得问题出在这个天真的decltype(T :: _ Foo))

1 个答案:

答案 0 :(得分:2)

仅在涉及推断的模板参数时才有效。您可能需要添加一个间接级别,并在T 具有合适的_Foo的情况下禁用第一个方法。或者,作为替代方案,我将展示如何使用...int降低重叠解析的优先级:

template <class T>
void foo_impl(const Foo* f, T*, ...) // this is general case template
{

}

// this should work only if T has static variable named _Foo with type const Foo*
template <class T>
typename std::enable_if<std::is_same<decltype(T::_Foo), const Foo*>::value>::type 
  foo_impl(const Foo* f, T*, int)
{
   T::_Foo = f;
}

template <class T>
void foo(const Foo* f) // this is general case template
{
    return foo_impl(f, (T*)nullptr, 0);
}

Live example