尝试将remove_reference用作函数参数

时间:2019-04-14 20:43:08

标签: c++

所以,我正在做作业,作为代码的一部分,我需要创建一个带有3个参数的函数,前两个是构成某个元素块的指针或迭代器,第三个参数是函数具有一个参数,并且该参数与两个指针或迭代器之间的块的元素具有相同的类型。

如果我仅使用

decltype<*p1+*p1>

其中p1是指向元素块的指针,但是如果元素是复数,它将不起作用。

我尝试了以下操作,但不起作用

template <typename Type>
bool Fun(Type p1,Type p2,bool(*f)(std::remove_reference<decltype(p1)>::type))

并显示以下内容:错误:在(()令牌

之前应为','或'...'

3 个答案:

答案 0 :(得分:1)

为什么不使用iterator traits?由于某种原因,它们位于标准库中。

template <typename InputIt>
bool Fun(
    InputIt first, 
    InputIt last,
    bool(*f)(std::iterator_traits<InputIt>::value_type)
)

此外,您可以考虑“鸭式打字”功能参数:

template <typename InputIt, typename F>
bool Fun(
    InputIt first, 
    InputIt last,
    F f
)
{
    using std::iterator_traints<InputIt>::value_type;
    value_type x { whatever() };
    do_something_with(f(x));
}

通常可以让您做您真正想做的事情,但没想到会尝试...

答案 1 :(得分:0)

以通用方式作用于迭代器的函数也应该在function参数上作为模板:

template<class Iter, class Func>
bool do_stuff(Iter begin, Iter end, Func&& func) {
    // ...
}

这具有以下好处:

  • 该函数现在接受lambda和其他使函数运算符超载的对象
  • 编译器可以内联函数调用,因为它知道在编译时正在调用哪个函数
  • 如果func通过引用,通过const引用或通过使用其构造实际参数来获取参数,则代码仍将编译。

答案 2 :(得分:0)

发生此错误消息是因为编译器无法弄清楚它应该期望什么。如果您告诉编译器它应该期望标识符type引用类型,则代码将进行编译:

template <typename Type>
bool Fun(Type p1,Type p2,bool(*f)(typename std::remove_reference<decltype(p1)>::type))
                                  ^^^^^^^^

很多人发现此类型输入过多(在C ++ 11中),因此C ++ 14为同一事物引入了一个较短的名称:

template <typename Type>
bool Fun(Type p1,Type p2,bool(*f)(std::remove_reference_t<decltype(p1)>))
                                                       ^^              ^.. no "::type"

仍然...您是否想要decltype(*p1),而不是迭代器本身的类型?