c++ 如何编写一个模板函数来处理结构体和CPP类型,如float?

koaltpgm  于 2023-05-02  发布在  其他
关注(0)|答案(2)|浏览(84)

我有两个对象和一个模板类的结构模板。我希望这个结构体可以作为类对象的类型之一,我希望类的函数能够操作它们。对于相同的类型,我希望这个类能够操作标准的CPP类型,比如int和float。

template<typename T>
struct user_type
{
    T obj1;
    T obj2;
};

template<class T>
class array
{
    int length;
    T* ar_ptr;
    
    public:

    void setArray();
};

template<class T> void array<T>::setArray()
{
    for(int i = 0; i < length; ++i)
    {
        (*(ar_ptr+ i)).obj1 = 0;
        (*(ar_ptr+ i)).obj2 = 0;
    }
}

template <typename T>
void array<T>::setArray()
{
    for(int i = 0; i < length; ++i)
    {
        *(ar_ptr+ i) = 0;
    }
}

我试图给予set函数两个不同的声明,但我得到了以下错误:

error: redefinition of 'setArray'

error: member reference base type 'float' is not a structure or union

声明这个函数并示例化它的正确方法是什么?我希望用同一个类来操作一个结构和一个启动CPP类型。

fhg3lkii

fhg3lkii1#

你的设计似乎有冲突,或者你误解了你的任务/练习或设计。类型array<T>不能容纳user_type<T>对象。也许你误解了模板类型T,这两个模板(和其他模板)都可以不同?
我猜你真正需要和想要的是这样的:

template<typename T>
struct user_type
{
    T obj1;
    T obj2;
};

template<typename T>
class array
{
public:
    // Other public members...

    void setArray()
    {
        for (size_t i = 0; i < length; ++i)
        {
            ar_ptr[i] = {};
        }
    }

private:
    T* ar_ptr;
    size_t length;
};

然后对于“normal”类型,你可以像“normal”一样创建你的数组示例:

array<int> int_array;

对于user_type模板,您使用示例化的user_class模板作为类型(本示例使用user_type<int>使结构int的两个成员都成为变量):

array<user_type<int>> user_type_int_array;

在这两种情况下,你都可以调用setArray,“正确”的事情应该会发生:

int_array.setArray();  // Default initialize (to zero) all elements of the array

user_type_int_array.setArray();  // Default initialize all user_type<int> elements
                                 // the obj1 and obj2 should be default initialized
                                 // which for user_type<int> means the will become zero
zwghvu4y

zwghvu4y2#

如何编写一个模板函数来处理结构体和CPP类型(如float)?

方法一:简体中文

一种方法是使用constexpr ifstd::is_arithmetic_v,如下所示:

template<class T> void array<T>::setArray()
{
    if constexpr(std::is_arithmetic_v<T>)
    {
           //code for int, char, double etc
    }
    else
    {
        //code for other types 
        for(int i = 0; i < length; ++i)
        {
            (*(ar_ptr+ i)).obj1 = 0;
            (*(ar_ptr+ i)).obj2 = 0;
        }
    }
    
}

Demo

方法二:C++20

这使用了requires子句。

template<class T>
class array
{
    int length;
    T* ar_ptr;
    
    public:

    void setArray() requires(std::is_arithmetic_v<T>);
    void setArray() requires(!std::is_arithmetic_v<T>);
};
//code for arithmetic types
template<class T> void array<T>::setArray() requires(std::is_arithmetic_v<T>)
{
    
    
}

template<class T> void array<T>::setArray() requires(!std::is_arithmetic_v<T>)
{
    
    
}

working demo

相关问题