目前,我有以下代碼:方式概括C++代碼與不同類型相似
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'。這可以讓你一半。 – Yakk 2014-12-06 02:20:17