我正在尝试以下方法:
template <typename T>
struct Wrapper
{
T t;
};
template <class Derived>
struct wrapper_support
{
template <typename T>
bool operator ()(Wrapper<T> const & w) const
{
return static_cast<Derived const &>(*this)(w.t);
}
};
struct functor : wrapper_support<functor>
{
template <typename T>
bool operator ()(T t) const {return t == 42;}
};
void test()
{
functor f;
std::cout << f(Wrapper<int>{42}) << std::endl;
}
但无法编译:在解析对f.operator ()
的调用时,只会考虑functor::operator ()(T) const
,因为它隐藏了wrapper_support
&#39; s operator ()
。
将代码更改为
struct functor : wrapper_support<functor>
{
using wrapper_support<functor>::operator ();
template <typename T>
bool operator ()(T t) const {return t == 42;}
};
解决了这个问题,但我希望我可以避免添加using
指令。
编辑:
我最终使用宏实现了它:
#define WRAPPER_SUPPORT \
template <typename T> \
bool operator ()(Wrapper<T> const & w) const \
{ \
return (*this)(w.t); \
}
struct functor
{
template <typename T>
bool operator ()(T t) const {return t == 42;}
WRAPPER_SUPPORT
};
但后来我遇到了一个新问题。为了更通用,我将宏更改为以下内容:
#define WRAPPER_SUPPORT \
template <typename T> \
auto operator ()(Wrapper<T> const & w) const \
-> decltype((*this)(w.t)) \
{ \
return (*this)(w.t); \
}
它再次陷入与Visual C ++ 2013相同的问题。
我尝试了Ideone上的代码(在C ++中,而不是在C ++ 14中),它运行良好。
这是Visual C ++的限制,是否有解决方法?