【发布时间】:2014-12-05 20:45:09
【问题描述】:
目前我有以下代码:
static void markPoolsFree(const TNetgroupPools &group_info, TObjectID netiface) {
for (size_t i = 0; i<group_info.public_pools.length();i ++ ) {
SDK::revokeIPPoolFromNetworkInterface(group_info.public_pools[i],netiface);
}
for (size_t i =0 ; i<group_info.private_pool.length(); i++) {
SDK::revokeIPPoolFromNetworkInterface(group_info.private_pool[i].pool_id,
netiface);
}
}
其逻辑基本相同,但group_info.public_pools[i] 和group_info.private_pool[i] 类型不同,这就是为什么在第二个循环中我们必须添加.pool_id 成员调用。这些类型是不同的,没有任何关系。
我想重写这段代码以使其更通用,例如像这样(草图):
// template function
template <typename Container, typename PredArgs>
static void revokeIPPool(const Container &pool, TObjectID netiface,
bool (*pred)(PredArgs pool_id, PredArgs netiface_id))
{
for (size_t i = 0; i < pool.length(); ++i) {
if (pred(pool[i], netiface)) {
SDK::revokeIPPoolFromNetworkInterface(pool[i], netiface);
}
}
}
// calling code
static void markPoolsFree(const TNetgroupPools &group_info, TObjectID netiface) {
revokeIPPool(group_info.public_pools, netiface, SDK::isPredicateTrue);
revokeIPPool(group_info.private_pool, netiface, SDK::isPredicateTrue);
}
但问题在于public_pools 和private_pool 的类型不同。
问题: 您能否提供所有方法,如何通过示例概括此代码?我需要 C++03 代码,但是 C++11/C++14 是可以接受的。
我的想法:
- 代替
SDK::revokeIPPoolFromNetworkInterface使wrapperIPPool具有两种类型的重载并在内部调用SDK::revokeIPPoolFromNetworkInterface。 - 两种类型都重载
revokeIPPool(但它是代码重复,对原始代码没有改进) -
revokeIPPool的部分函数模板特化(这可能吗?) -
revokeIPPool的全功能模板特化 - 在类中包装函数
revokeIPPool并使部分类模板特化。
问题:
- 我的哪些想法是正确的?
- 优缺点是什么?
- 对于 C++03 或 C++11,哪个更惯用?
- 还有其他解决方案吗?
【问题讨论】:
-
私有池的
.pool_id与public_pool的类型相同。重载一个函数,该函数在公共池上返回输入,在私有池上返回.pool_id。这可以让你成功。