C 策略设计具有可变类型返回值



我想使用基于策略的设计以基于我使用的策略的返回类型的返回类型。这是一个示例:

class IntPolicy {
public:
    int doIntPolicy(double anInput) {
        return static_cast<int>(anInput);
    }
};
class DoublePolicy {
public:
    double doDoublePolicy(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.doDoublePolicy(_intPolicy.doIntPolicy(input))) {
        auto aVar =  _intPolicy.doIntPolicy(input);
        return _doublePolicy.doDoublePolicy(aVar);
    }

};

这是我如何使用主机类和政策:

typedef SimpleHost<IntPolicy, DoublePolicy> Host;
Host host;
auto theOutput = host.doHost(5);

虽然这种编译并起作用,但请注意,我必须将DOHOST方法的主体放在声明函数中,以便编译器可以推断出落后的返回。如果Do -Host功能的身体很大,那么这看起来将非常丑陋。有什么办法可以避免这种情况?

如果您不喜欢它的外观,则可能尝试定义?

#define RECURSE_POLICY(E) policy2.doPolicy(policy1.doPolicy(E)) 
template<typename InputType>
auto doHost(InputType input) -> decltype(RECURSE_POLICY(input)) {
    return RECURSE_POLICY(input);
}

话虽如此,您必须两次称呼两次polly的东西看上去并不正确。也许您可以将其重构。

1.-扩展模板

#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.-最简单的方法是重命名IMP

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);
    }

但是,为了真正帮助您,我们需要您要致电的特定功能,我的意思是我觉得这已经是一团糟。

最新更新