【问题标题】:Template with default value of method pointer argument具有方法指针参数默认值的模板
【发布时间】:2016-03-22 21:44:42
【问题描述】:

考虑一下这个特殊的容器类,它存储了其中包含键和值的类型,所以

template<typename K, typename T, K (T::*method)() const>
class Container
{
//...
};

K 是键的类型,T 是值的类型,方法指针用于从值中检索键。

它工作正常,但我想为方法指针添加一个默认值,这样当调用者没有指定它时,它会是operator K() const,如下所示:

template<typename K, typename T, K (T::*method)() const = &T::operator K const>

但是当我尝试实例化它时,这不会编译说明有no member operator const K on A (&lt;- my class I test this with)(并且有这样的方法)。甚至可以有方法指针模板参数的默认值吗?如果是,正确的语法是什么?

编辑:除了下面的解决方案之外,对于 T 是使用新 C++11 功能 std::remove_pointer&lt;T&gt;::type 的指针的情况,还有一个“修复”,所以:

template<typename K, typename T, K (std::remove_pointer<T>::type::*method)() const = &std::remove_pointer<T>::type::operator K>

【问题讨论】:

  • 这个想法是sound in principle。这可能只是正确拼写特定函数(转换函数)的名称的问题。
  • There,也许删除const
  • operator K const (== operator const K) 将是一个到 const K 的转换函数。

标签: c++ templates pointers member-function-pointers


【解决方案1】:

函数的名称只是operator K。它的资格不是名称的一部分。试试:

template <typename K,
          typename T,
          K (T::*method)() const = &T::operator K>
//                                 ^^^^^^^^^^^^^^

【讨论】:

  • 好点:成员的名称涉及限定符(或参数)。如果有必要解决重载,则需要通过转换为合适的成员指针来完成(在这种情况下,很方便,很容易获得)。
  • 对,当然。现在它可以工作,除非我使用指向 T 的指针作为参数。我想专业化应该对此有所帮助。
  • 我也发现了 T 也是指针的情况。添加为对 OP 的编辑。
猜你喜欢
  • 1970-01-01
  • 2019-09-12
  • 2021-11-01
  • 2011-05-25
  • 2013-10-01
  • 2019-01-09
  • 2023-03-13
  • 2015-02-04
  • 1970-01-01
相关资源
最近更新 更多