3

我正在努力完成标题中描述的事情。

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) 上)

4

1 回答 1

2

它仅在涉及推导的模板参数时才有效。您可能需要添加一个间接级别并禁用第一种方法,以防万一T 合适的_Foo. 或者,作为替代方案,我将展示如何通过使用...vs.来降低其重载决议的优先级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);
}

活生生的例子

于 2013-10-22T16:33:13.170 回答