I am invoking the below function from different classes and files like as shown below. And the implementation is almost similar. But it is initializing in the respective class constructor.
Can I create a common function for the below code for all the classes and then when invoking, based on the class can I initialize and return the object?
Below is the function with almost similar implementation for all the classes. And I have this similar implementation in around 10 places.
Could someone please suggest me the better approach to create a common reusable function?
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;
}
Updated code using templatized class based on the inputs:
.h file
#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 file
#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);
}