【问题标题】:C++: How to work with data type of parameter in member function templateC++:如何在成员函数模板中使用参数的数据类型
【发布时间】:2015-08-10 14:18:48
【问题描述】:

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

在类.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,因为它会在专用函数中复制大量通用代码(如上面的代码中所述)。

【问题讨论】:

  • 也使用模板特化代替if (T == SomeClass)
  • template&lt;&gt; void Class::function(SomeClass) value) { // code for SomeClass ... }
  • 另外,不知道这是怎么复制的?另一个问题是关于模板实现的通用问题。我要问的是这个非常具体。
  • @πάνταῥεῖ 实现拆分是个问题,但这不是这个问题的重点。

标签: c++


【解决方案1】:

您需要根据 T 的实际类型将代码移动到第二个成员(或静态)函数,然后您可以重载该函数,将公共代码产生的任何值作为参数传递 (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

【讨论】:

  • 太棒了!这就是我要找的:)
【解决方案2】:

我很确定最直接的方法是重载和委派工作:

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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    相关资源
    最近更新 更多