On Monday, 16 June 2014 at 09:24:22 UTC, Marc Schütz wrote:
You can pass anything to the sort function that's callable, including an object:

    struct MyCompare {
        SortOrder order;
        int column;
bool opCall(const ref DataRow lhs, const ref DataRow rhs) {
            return order == SortOrder.ASC ?
                lhs[column] < rhs[column] :
                rhs[column] < lhs[column];
        }
    }

    import std.algorithm;
    MyCompare cmp(SortOrder.ASC, 10);
    my_columns.sort!cmp;

(Untested.)

That works, but it's not very idiomatic. Well, I have never seen a C++ style "functor" used in D template is what I'm saying. I don't know if that's good or bad. A more idiomatic approach would be to simply pass a delegate to your function.

This can either be as a pointer to member function:

struct MyCompare {
    SortOrder order;
    int column;
    bool compare(const ref DataRow lhs, const ref DataRow rhs)
{
    return order == SortOrder.ASC ?
        lhs[column] < rhs[column] :
        rhs[column] < lhs[column];
    }
}

import std.algorithm;
MyCompare cmp(SortOrder.ASC, 10);
auto dg = &cmp.compare;
my_columns.sort!dg;

Or, more generally, via a lambda, or a function with state:

import std.algorithm;
column = 10;
bool compare(const ref DataRow lhs, const ref DataRow rhs)
{
    return order == SortOrder.ASC ?
        lhs[column] < rhs[column] :
        rhs[column] < lhs[column];
    }
}
my_columns.sort!compare;

Reply via email to