C 策略设计具有可变类型返回值
C++ Policy Based Design With Variable Type Return Value
我想使用基于策略的设计以基于我使用的策略的返回类型的返回类型。这是一个示例:
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);
}
但是,为了真正帮助您,我们需要您要致电的特定功能,我的意思是我觉得这已经是一团糟。
相关文章:
- 如何使用 uint64_t 键类型从 std::map<int, std::string> 返回值?
- 对于具有引用返回类型的搜索算法,默认返回值应该是什么?
- 函数的返回值类型是别名 ***或 *** 布尔值
- 如何为具有常量类型的函数正确转换来自 DLsym 的返回值?
- Pybind11:作为返回值的外部类型
- 从类型bankAccount的返回值到函数返回类型int没有可行的转换
- 更改 Python 切换的 C 函数的返回值类型
- 如果我忽略返回类型shared_ptr函数的返回值怎么办
- 返回类型为 int 的函数中的默认返回值 1?
- 重载运算符返回什么类型的值(对于用户定义的类型):右值还是左值?
- 编写一个函数,该函数将通过判断其每个参数的类型来自动确定其返回值
- 为什么当返回类型为 const 时可以修改返回值
- C 语法,根据此代码返回值类型
- 函数返回值的自动类型扣除
- 如何在另一个成员函数中修改具有常量返回类型的成员函数的返回值
- 使用模板返回值从函数中删除类型
- 铸造返回值为模板类型
- 如何在模板类中使用嵌套的结构/类类型作为返回值
- C 策略设计具有可变类型返回值
- C++模板:按类型返回值