【发布时间】:2020-11-17 16:38:37
【问题描述】:
我正在从不同的类和文件中调用以下函数,如下所示。 并且实现几乎相似。但它正在各自的类构造函数中初始化。
我可以为所有类的以下代码创建一个通用函数吗 然后在调用的时候,可以根据类初始化并返回对象吗?
下面是所有类的实现几乎相似的函数。我在大约 10 个地方都有类似的实现。
有人可以建议我创建通用可重用函数的更好方法吗?
1.
shared_ptr<CTestOneImpl> COneImpl::createTestObject(const string& f_strSFID, short f_nID,
bool f_bIsVerified,
bool f_bIsProcessed)
{
shared_ptr<CTestOneImpl> l_pTestObj = nullptr;
l_pTestObj = make_shared<CTestOneImpl>(f_nID, f_strSFID,
f_bIsVerified, f_bIsProcessed,
this);
return l_pTestObj;
}
shared_ptr<CTestTwoImpl> CTwoImpl :: createTestObject(string f_hStrSFID, long f_nID,
bool f_bIsVerified,
bool f_bIsProcessed)
{
shared_ptr<CTestTwoImpl> l_pTestObj = nullptr;
l_pTestObj = make_shared<CTestTwoImpl>(f_nID, f_hStrSFID, f_bIsVerified
, f_bIsProcessed, this);
return l_pTestObj;
}
shared_ptr<CTestThreeImpl> CThreeImpl ::createTestObject(const string& f_strSFID,
const string& f_nID,
bool f_bIsVerified,
bool f_bIsProcessed)
{
shared_ptr<CTestThreeImpl> l_pTestObj = nullptr;
l_pTestObj = make_shared<CTestThreeImpl>(f_nID,
f_strSFID,
f_bIsVerified,
f_bIsProcessed,
this);
return l_pTestObj;
}
使用基于输入的模板化类更新代码:
.h 文件
#include <iostream>
#include <list>
template <typename RetType, typename Args1, typename Args2, typename Args3>
class CTestImpl
{
public:
CTestImpl(std::string f_lCallIdentifier, bool f_bIsVerified,
bool f_bIsProcessed);
private:
std::shared_ptr<RetType>
createTestObject(Args1&& f_strSFID, Args2&& f_bIsVerified, Args3&& f_bIsProcessed);
public:
void handleEvents(const std::string& f_eCallEvent, const std::string& f_strSFID);
};
.Cpp 文件
#include "TestImpl.h"
template <typename RetType, typename Args1, typename Args2, typename Args3>
// error: C2976: 'CTestImpl': too few template arguments
std::shared_ptr<RetType> CTestImpl<RetType>::createTestObject(Args1&& f_strSFID, Args2&& f_bIsVerified, Args3&& f_bIsProcessed)
// error: C2244: 'CTestImpl::createTestObject': unable to match function definition to an existing declaration
{
return std::make_shared<RetType>(std::forward<Args1>(f_strSFID),
std::forward<Args1>(f_bIsVerified),
std::forward<Args1>(f_bIsProcessed));
}
//error: C2955: 'CTestImpl': use of class template requires template argument list
void CTestImpl::handleEvents(const std::string& f_eCallEvent, const std::string& f_strSFID)
{
// error: C2509: 'handleEvents': member function not declared in 'CTestImpl'
shared_ptr<CTestImpl> l_hCallObj = nullptr;
l_hCallObj = createTestObject(f_strSFID, true, false);
}
【问题讨论】:
-
顺便说一句:调用一个函数的用例是什么,它实际上什么都不做,只是将所有参数转发给另一个函数。如果您将 createTestObject() 替换为 make_shared() 其他任何内容都不会改变。但是,如果您的 create func 中有任何有用的东西,您只需将其设为模板即可。这将保护源代码,生成的程序集不应更改,这意味着您没有为 prog 提供安全的代码大小。
-
你可以使用GPP生成C++代码