Best Way to Pass Template Typed Alias Parameters for Functions?
Vijay Nayar
madric at gmail.com
Sun Dec 23 17:13:49 UTC 2018
I have a few cases where I would like to pass in a function as a
value to a template, but I want to ensure that the function takes
certain kinds of parameters, is a const function, or matches any
other set of conditions.
What is the best way to do this? Just to avoid any potential
confusion, I've included a few examples below. I'm using explicit
functions rather than lambdas just avoid any possibility of types
being incorrectly inferred.
size_t myHashFunction(int a) { return cast(size_t) a; }
void main() {
class A(KeyT, HashF) { }
auto a = new A!(int, myHashFunction);
// ^ onlineapp.d: Error: template instance `A!(int,
myHashFunction)`
// does not match template declaration `A(KeyT, HashF)`
// Alias parameter:
https://dlang.org/spec/template.html#aliasparameters
class B(KeyT, alias HashF) { }
auto b = new B!(int, myHashFunction);
// ^ Works, but we cannot enforce the kind of function passed
in.
// Typed alias parameter:
https://dlang.org/spec/template.html#typed_alias_op
class C(KeyT, alias size_t function(KeyT) HashF) { }
auto c = new C!(int, myHashFunction);
// ^ onlineapp.d: Error: template instance `C!(int,
myHashFunction)`
// does not match template declaration `C(KeyT, alias size_t
function(KeyT) HashF)`
// Specialization:
https://dlang.org/spec/template.html#alias_parameter_specialization
class D(KeyT, alias HashF : size_t function(KeyT)) { }
auto d = new D!(int, myHashFunction
// ^ onlineapp.d: Error: template instance `D!(int,
myHashFunction)`
// does not match template declaration `D(KeyT, alias HashF :
size_t function(KeyT))`
}
Looking at some of the code in std.algorithm, it seem that static
asserts are sometimes used for this purpose. Does anyone have a
solution to this problem of instantiating template classes whose
parameters are functions? I have used std.function "unaryFun"
before, but this has the problem of not being able to specify
function attributes, like const.
More information about the Digitalmars-d-learn
mailing list