我必须根据作为参数获得的类类型在我的模板中执行事件:
在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++ 有更好的方法。
更新: 不是真的要找Template specialization因为它会在专用函数中复制大量通用代码(如上面代码中所述)。
最佳答案
您需要根据 T
的实际类型将代码移动到第二个成员(或静态)函数,然后您可以重载该函数,将公共(public)代码产生的任何值作为参数传递(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
进行编译。
关于C++:如何在成员函数模板中使用参数的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31922020/