簡體   English   中英

C ++:如何使用成員函數模板中參數的數據類型

[英]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
}

現在,我有以下問題:

  1. if (T == SomeClass)語法不正確。 我該怎么辦?

  2. 我完成的T類型轉換不會給我任何語法錯誤。 但這適合這樣做嗎? 我相信C ++有更好的方法。

更新:並不是真的要尋找模板專業化,因為它會在專業化功能中復制很多通用代碼(如上面的代碼中所述)。

您需要根據T的實際類型將代碼移動到第二個成員(或靜態)函數,然后再進行重載,將通用代碼產生的任何值作為參數( someParamsomeParam

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM