1.- Template extension
#include <stdio.h> #include <string> #include <iostream> class IntPolicy { public: int doIntPolicy(double anInput=NULL) { if(!NULL) { return static_cast<int>(anInput); } else { return -1; } } }; class DoublePolicy { public: double doDoublePolicy(int anInput=NULL) { if(!NULL) { return static_cast<double>(anInput); } else { return -1; } } }; template<typename IntPolicyType, typename DoublePolicyType, class __Type > class SimpleHost { private: IntPolicyType _intPolicy; DoublePolicyType _doublePolicy; public: template<typename InputType> auto doHost(InputType input) -> __Type { auto aVar = _intPolicy.doIntPolicy(input); return _doublePolicy.doDoublePolicy(aVar); } }; int main() { IntPolicy foo; DoublePolicy bar; typedef SimpleHost<IntPolicy, DoublePolicy, decltype(bar.doDoublePolicy(foo.doIntPolicy()))> Host; Host host; auto theOutput = host.doHost(5); return 0; }
2.- The easiest way is to rename impl if you are using an external library that you could consider. Wrap for this purpose
class IntPolicy { public: int doPolicy(double anInput) { return static_cast<int>(anInput); } }; class DoublePolicy { public: double doPolicy(int anInput) { return static_cast<double>(anInput); } }; template<typename IntPolicyType, typename DoublePolicyType> class SimpleHost { private: IntPolicyType _intPolicy; DoublePolicyType _doublePolicy; public: template<typename InputType> auto doHost(InputType input) -> decltype(_doublePolicy.doPolicy(_intPolicy.doPolicy(input))) { auto aVar = IntPolicyType.doPolicy(input); return DoublePolicyType.doPolicy(aVar); }
But in order to really help you, we need specific functions that you are trying to call, I mean, I feel that this is already a mess.
source share