我有一个csharp代码,它为列表定义了两个Splice和FindIf函数(已在C ++中为列表提供)。我正在尝试为c ++创建两个函数,以便在没有c ++内置函数的情况下使用。 csharp和c ++函数都在下面给出
static class ListExtensions
{
public static void Splice<T>(this List<T> list, int insertAtIndex, List<T> items,
int first, int last)
{
if (items == null) return;
insertAtIndex = Math.Min(list.Count, Math.Max(0, insertAtIndex));
first = Math.Min(items.Count - 1, Math.Max(0, first));
last = Math.Min(items.Count, Math.Max(1, last));
if (first >= last) return;
list.InsertRange(insertAtIndex, items.GetRange(first, last - first));
items.RemoveRange(first, last - first);
}
public static int FindIf<T>(this List<T> list, int start, int end, Func<T, bool> method)
{
if (method == null) return end;
if (!list.Any(method)) return end;
start = Math.Min(list.Count - 1, Math.Max(0, start));
end = Math.Min(list.Count, Math.Max(1, end));
if (start >= end) return end;
List<T> range = list.GetRange(start, end - start);
int index = range.IndexOf(list.First(method));
if (index < start) return end;
return index;
}
}
Csharp函数的调用方式如下
static bool Move_tokens_to_statement(List<Evl_token> statementTokens, List<Evl_token> tokens)
{
Debug.Assert(tokens != null);
int next_sc = tokens.FindIf(0, tokens.Count, TokenIsSemicolon);
if (next_sc == tokens.Count)
{
Console.WriteLine("Looked for ';' but reached the end of the file.");
return false;
}
++next_sc;
statementTokens.Splice(0, tokens, 0, next_sc);
return true;
}
我迄今为止编写的C ++代码如下所示
template<typename T>
void Splice(std::list<T> &List, int insertAtIndex, std::list<T> items,
int first, int last)
{
if (items == null) return;
insertAtIndex = std::min(List.size(), (int)std::max(0, insertAtIndex));
first = std::min(items.size() - 1, std::max(0, first));
last = std::min(items.size(), std::max(1, last));
if (first >= last) return;
std::copy(first, last-first, std::back_inserter(items));
List.insert(insertAtIndex, items);
items.erase(first, last - first);
};
template<typename T>
int FindIf(std::list<T> &List, int start, int end, bool(*method)(T))
{
if (method == null) return end;
if (!(std::any_of(List.begin(),List.end(),return method))) return end;
start = std::min(List.size() - 1, std::max(0, start));;
end = std::min(List.size(), std::max(1, end));
if (start >= end) return end;
list<T> range = std::copy(start, end - start, std::back_inserter(List));
int index = range.IndexOf(List.Front(method));
if (index < start) return end;
return index;
};
我在c ++定义的Splice和FindIf函数中看到的错误如下所示
在列表上调用的FindIf有错误“没有FindIf的实例匹配参数列表。参数类型是....”
Splice调用列表有错误“类std :: list ....没有成员Splice”
在c ++中为我的代码定义自己的函数的最佳方法是什么?什么是解决方案?
答案 0 :(得分:1)
有两种主要方式。
传统的方法是调用你的函数(就像你已定义它们一样),就像非成员函数一样。
boost引入的前卫方式是为|
等运算符重载myList | FindIf(...) | Unique() | Reversed()
等语法。您可以在Boost.Range库中查看这是如何完成的。