C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 我可以在成员函数上使用boost :: enable_if吗?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在编写一个模板类,我想允许另一种方法仅存在于某种模板类型.目前,该方法适用于所有模板类型,但会导致所有其他类型的编译错误.

使这更复杂的是它是一个重载的operator().不知道我想要做什么实际上是可能的.

这就是我现在拥有的:

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不会浪费时间创建访问器方法.

解决方法@H_419_20@
是的,这是可能的,但不能直接使用类模板参数. 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,T>::type const &
  operator() (const U& foo) const;
};

这是有效的,因为Utility2只能从某种BASE类型创建.因此,如果BASE类型是其他类型,则operator()的const版本将不存在.

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

大佬总结

以上是大佬教程为你收集整理的c – 我可以在成员函数上使用boost :: enable_if吗?全部内容,希望文章能够帮你解决c – 我可以在成员函数上使用boost :: enable_if吗?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。