所以,我正在做作业,作为代码的一部分,我需要创建一个带有3个参数的函数,前两个是构成某个元素块的指针或迭代器,第三个参数是函数具有一个参数,并且该参数与两个指针或迭代器之间的块的元素具有相同的类型。
如果我仅使用
decltype<*p1+*p1>
其中p1是指向元素块的指针,但是如果元素是复数,它将不起作用。
我尝试了以下操作,但不起作用
template <typename Type>
bool Fun(Type p1,Type p2,bool(*f)(std::remove_reference<decltype(p1)>::type))
并显示以下内容:错误:在(()令牌
之前应为','或'...'答案 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) {
// ...
}
这具有以下好处:
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)
,而不是迭代器本身的类型?