There is no need to check any relation between C1 and C2. This should be enough:
```D
isSomeChar!C1 && isInputRange!C2 &&
isOutputRange!(R, C1[]) && isOutputRange!(R, C2)
```
The whole `put`/`OutputRange` machinery will take care of the rest behind the scenes.

And yes, that does mean you can do something like:
```D
auto app = appender!(wchar[])();
"myFileName".setExtension(".txt"d, app);
```