Is it possible to filter variadics?
    Jakob Ovrum via Digitalmars-d-learn 
    digitalmars-d-learn at puremagic.com
       
    Tue Nov  3 22:20:28 PST 2015
    
    
  
On Tuesday, 3 November 2015 at 23:41:10 UTC, maik klein wrote:
> Is it possible to filter variadics for example if I would call
>
> void printSumIntFloats(Ts...)(Ts ts){...}
>
> printSumIntFloats(1,1.0f,2,2.0f);
>
> I want to print the sum of all integers and the sum of all 
> floats.
>
>
> //Pseudo code
> void printSumIntFloats(Ts...)(Ts ts){
>     auto sumOfInts = ts
>                       .filter!(isInteger)
>                       .reduce(a => a + b);
>     writeln(sumOfInts);
>     ...
> }
>
> Is something like this possible?
import std.algorithm.iteration : sum;
import std.meta : allSatisfy, Filter;
import std.traits;
import std.typecons : tuple;
import std.range : only;
// These two are necessary since the ones in std.traits
// don't accept non-types
enum isIntegral(alias i) = std.traits.isIntegral!(typeof(i));
enum isFloatingPoint(alias f) = 
std.traits.isFloatingPoint!(typeof(f));
auto separateSum(T...)(T args)
	if(allSatisfy!(isNumeric, T))
{
	return tuple(only(Filter!(isIntegral, args)).sum(), 
only(Filter!(isFloatingPoint, args)).sum());
}
pure nothrow @safe unittest
{
	assert(separateSum(2, 2.0) == tuple(2, 2.0));
	assert(separateSum(3, 2.0, 5, 1.0, 1.0) == tuple(8, 4.0));
}
    
    
More information about the Digitalmars-d-learn
mailing list