C++:如何在成员函数模板中使用参数的数据类型

标签 c++

我必须根据作为参数获得的类类型在我的模板中执行事件:

在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
}

现在我有这些问题:

  1. 此处 if (T == SomeClass) 语法不正确。我该怎么做?

  2. 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/

相关文章:

c++ - 使用 RAII 写入文件结束标记?

c++ - 增加一个常量前向迭代器

c++ - 在 MS Visual Studio 2017 中将 boost::thread 与 CMake 一起使用会导致两个编译器错误

c++ - 动态 int * 数组作为 C++ 映射的键

c++ - 我必须分离或加入 pthread 吗?

c++ - "Read"没有命名类型

c++ - 在 Arduino 上拆分字符串

c++ - char和int放到同一个数组中

c++ - CUDA双矩阵溢出

c++ - 在 C++ 中使用模板静态计算数组长度