我最近开始从事旧项目。我可以看到以下格式的许多代码重复:
void somefunc(arg1,arg2,Type1 * Ptr)
{
//some logic
}
//在Type2上超载
void somefunc(arg1,arg2,Type2 * Ptr)
{
//same logic
}
这两个功能之间唯一的区别是类型的 第三个论点。 Type1和Type2 源自 Type 。
类型在运行时确定。所以我尝试了这样的事情
void somefunc(arg1,arg2,Type * Ptr)
{
if (arg1.version > 14)
Type1 *ptr = dynamic_cast<Type1*>(Ptr);
else
Type2 *ptr = dynamic_cast<Type2*>(Ptr);
//some logic using ptr
}
但是在运行时需要dynamic_cast来确定正确的类型。而且我必须使用if else块在很多地方更新代码。
Boost变体的想法。看起来与上述方法类似。
是否有一种更简单/优雅的方法来避免这种代码重复?
答案 0 :(得分:2)
是否有一种更简单/优雅的方法来避免这种代码重复?
最简单的方法是将var objShell = WScript.CreateObject("WScript.Shell")
用作模板函数:
#Import Modules
from termcolor import colored
from selenium import webdriver
import requests
import os
import sys
import time
#Proxy Grab
options = webdriver.ChromeOptions()
options.add_argument('headless')
driver = webdriver.Chrome(chrome_options=options)
driver.get("https://www.sslproxies.org/")
tbody = driver.find_element_by_tag_name("tbody")
cell = tbody.find_elements_by_tag_name("tr")
for column in cell:
column = column.text.split(" ")
print(colored(column[0]+":"+column[1],'yellow'))
driver.quit()
print("")
os.system('clear')
os.system('cls')
#Proxy Connection
print(colored('Getting Proxies from graber...','green'))
time.sleep(2)
os.system('clear')
os.system('cls')
proxy = {"http": "http://"+ column[0]+":"+column[1]}
url = 'https://mobile.facebook.com/login'
r = requests.get(url, proxies=proxy)
print("")
print(colored('Connecting using proxy' ,'green'))
print("")
sts = r.status_code
因此,您可以使用somefunc()
或template <typename T>
void somefunc(arg1,arg2,T* Ptr)
{
//some logic
}
来调用somefunc()
,而无需使用Type1
确定它们:
Type2
类型在运行时确定。所以我尝试了这样的事情
dynamic_cast<>
由于Type1 a;
Type2 b;
somefunc(x,y,&a); // Uses Type1
somefunc(x,y,&b); // Uses Type2
仅在void somefunc(arg1,arg2,Type * Ptr)
{
if (arg1.version > 14)
Type1 *ptr = dynamic_cast<Type1*>(Ptr);
else
Type2 *ptr = dynamic_cast<Type2*>(Ptr);
//some logic using ptr
}
/ ptr
范围块中被声明为可见,因此将永远无法工作,并且您将需要再次复制逻辑。