[英]C++: How to work with data type of parameter in member function template
我必須根據作為參數獲取的類的類型在模板中進行活動:
在Class.h中
class SomeClass;
class SomeOtherClass;
class Class
{
public:
template <typename T> void function(T value);
};
在Class.cpp中
template<typename T> void Class::function(T value)
{
// Whole lots of common code here
if (T == SomeClass)
{
// Do something by casting value to SomeClass
SomeClass* ptrSomeClassObj = (SomeClass*) &value;
ptrSomeClassObj->MemberFunctionOfSomeClass();
}
else
{
// Do something else
}
// Whole lots of common code here
}
現在,我有以下問題:
if (T == SomeClass)
語法不正確。 我該怎么辦?
我完成的T
類型轉換不會給我任何語法錯誤。 但這適合這樣做嗎? 我相信C ++有更好的方法。
更新:並不是真的要尋找模板專業化,因為它會在專業化功能中復制很多通用代碼(如上面的代碼中所述)。
您需要根據T
的實際類型將代碼移動到第二個成員(或靜態)函數,然后再進行重載,將通用代碼產生的任何值作為參數( someParam
) someParam
:
class SomeClass;
class SomeOtherClass;
class Class
{
public:
void typeDependent(SomeClass value, int someParam);
template <typename T> void typeDependent(T value, int someParam);
template <typename T> void function(T value);
};
void Class::typeDependent(SomeClass value, int someParam)
{
value->MemberFunctionOfSomeClass(someParam);
}
template<typename T> void Class::typeDependent(T value, int someParam)
{
// Do something else
}
template<typename T> void Class::function(T value)
{
int someParam = 123; // Whole lots of common code here
typeDependent(value, someParam);
// Whole lots of common code here
}
這使您可以調用僅對SomeClass類型存在的函數,而無需強制轉換。 請注意,我沒有使用模板專業化,而是重載-由於函數模板的解析規則復雜,因此對功能模板使用專業化通常是一個壞主意。
如果堅持要將此條件作為條件寫,則可以使用std::is_same
模板(需要C ++ 11):
#include <type_traits>
template<typename T> void Class::function(T value)
{
if (std::is_same<T, SomeClass>::value)
{
// Do something
}
else
{
// Do something else
}
}
這將要求您像在原始文章中一樣使用類型轉換,因為否則該函數將不會針對T != SomeClass
編譯。
我敢肯定,最簡單的方法是重載和委派工作:
class SomeClass;
class SomeOtherClass;
class Class
{
public:
template <typename T> void function(T value);
template <typename T> void function_detail(T value);
void function_detail(SomeClass value);
};
template<typename T> void Class::function(T value)
{
// Whole lots of common code here
function_detail(value);
// Whole lots of common code here
}
template<typename T> void Class::function_detail(T value)
{
// Do something else.
}
void Class::function_detail(SomeClass value)
{
value.MemberFunctionOfSomeClass();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.