如何创建和使用自己的c ++函数而不是内置的库

时间:2018-01-10 21:27:54

标签: c# c++

我有一个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 ++中为我的代码定义自己的函数的最佳方法是什么?什么是解决方案?

1 个答案:

答案 0 :(得分:1)

有两种主要方式。

传统的方法是调用你的函数(就像你已定义它们一样),就像非成员函数一样。

boost引入的前卫方式是为|等运算符重载myList | FindIf(...) | Unique() | Reversed()等语法。您可以在Boost.Range库中查看这是如何完成的。