如果在一个成员函数?

我正在编写一个模板类,并且我想让一个额外的方法只存在于某个特定的模板类型中。 目前该方法适用于所有模板类型,但会导致所有其他类型的编译错误。

复杂的是它是一个重载的运算符()。 不知道我想要做什么实际上可能在这里。

这是我现在拥有的:

template<typename T, typename BASE>
class MyClass  : public BASE
{
public:

    typename T& operator() (const Utility1<BASE>& foo);
    typename T const& operator() (const Utility2<BASE>& foo) const;
};

我希望T&版本始终可用,但T const&版本仅在Utility2<BASE>有效时才可用。 现在,这两种方法都存在,但如果Utility2<BASE>无效,尝试使用const版本会产生奇怪的编译错误。 我宁愿有一个明智的错误,甚至是“没有这样的成员函数”错误。

这可能吗?

编辑 :通过阅读增强文档后,这里是我想出来的,它似乎工作:

template<typename T, typename BASE>
class MyClass  : public BASE
{
public:

    typename T& operator() (const Utility1<BASE>& foo);

    template<typename U>
    typename boost::enable_if<boost::is_same<Utility2<BASE>, U>, T>::type const &
    operator() (const U& foo) const;
};

因此,除非有人试图将其与Utility2一起使用,否则该方法不存在,并且只有在该BASE类型有效时才能创建一个Utility2。 但是,当它对BASE类型无效时,MyClass不会浪费时间创建访问器方法。


是的,这是可能的,但不直接与类模板参数。 boost::enable_if只能与方法本身的模板参数一起使用。 所以,用一点typedef用法:

template<typename T, typename BASE>
class MyClass  : public BASE
{
public:
  typedef Utility2<BASE> util;

  typename T& operator() (const Utility1<BASE>& foo);

  template<typename U>
  typename boost::enable_if<boost::is_same<util, U>, T>::type const &
  operator() (const U& foo) const;
};

这会起作用,因为Utility2只能从某个BASE类型创建。 所以如果BASE类型是别的,operator()的const版本将不存在。

所以,这是一件很小的事情。 它并没有让我受益匪浅。 但它很干净。

链接地址: http://www.djcxy.com/p/50447.html

上一篇: if on a member function?

下一篇: calling .NET COM object from VBScript