如何检查数据类型是否为数组? (C ++)

时间:2015-08-13 12:06:36

标签: c++

所以我现在是一名学生,并参加了以下练习: 编写一个打印数组中元素的函数。数组通过参数发送到函数。如果此参数不是数组,则必须抛出类型invalid_argument的异常。在main()函数中测试函数。

所以我的代码目前如下:

#include <iostream>
#include <exception>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::invalid_argument;
using std::string;

template<class T>void printArray(T arr){
    try{
        arr.size();
    }
    catch(...){
        for (int i=0; i < sizeof(arr); i++){
            cout << arr[i] << endl;
        }
    }
    throw invalid_argument("Argument not of type array");
};

int main(){
    string arrChars[5] = {"1", "2", "3", "John", "5"};
    string s = "Jack";
    try{
        printArray(arrChars);
    }
    catch(invalid_argument &e){
        cout << "Error: " << e.what() << endl;
    }

    return 0;
}

这是在尝试了其他选项之后,例如:

template<class T>void printArray(T arr[]){
...
}

不允许程序运行,因为我无法将任何参数传递给printArray()函数而不是数组。

我对代码的计划是将arrCharss换成printArray()的参数,以确定该计划的成功。

3 个答案:

答案 0 :(得分:7)

  

如果此参数不是数组,则必须抛出类型invalid_argument的异常。

这是......在C ++中想要做的奇怪的事情。通常情况下,我们选择&#34;如果此参数不是数组,则代码不应编译。&#34;但是,嘿,我们也可以这样做。只需编写一个带有数组的函数重载,以及一个带有任何内容的函数:

template <typename T, size_t N>
void printArray(const T (&arr)[N]) {
    // print array of size N here
}

template <typename T>
void printArray(const T& ) {
   throw invalid_argument("Argument not of type array");
}

答案 1 :(得分:0)

尝试这样的事情

#include <iostream>
#include <type_traits>
#include <stdexcept>
#include <vector>

template <class T>
void printArray( const T &a )
{
    if ( !std::is_array<T>::value ) throw std::invalid_argument("Argument not of type array");

    for ( const auto &x : a ) std::cout << x << std::endl;
}

int main()
{
    int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    try
    {        
        printArray( a );
        printArray( v );
    }
    catch ( const std::invalid_argument &e )
    {
        std::cout << e.what() << std::endl;
    }        
}   

程序输出

0
1
2
3
4
5
6
7
8
9
Argument not of type array

答案 2 :(得分:-1)

  

&#34;编写一个在数组中打印元素的函数&#34;

当你说&#34; array&#34;时,我们是在讨论C []数组还是std :: array。

假设您正在讨论std :: array,您可以编写一个模板方法,期望任何类型的一个参数。

如果你正在谈论它是std :: array那么它完全可以理解和可能。这是一个可能的解决方案。

使用dynamic_cast或typeid检查收到的参数的类型。

template <typename T> void printArray(const T& arrayArgument) { 

    if (std::array<int>& test == dynamic_cast<std::array<int>&>(arrayArgument))
         {/* do whatever */ }

 }

if(typeid(arrayArgument) == typeid(std::array<int>))

在以下文章中查找有关dynamic_cast和typeid的更多信息。

C++ dynamic_cast vs typeid for class comparison

如果您正在考虑使用C []数组,那么这篇文章可能会帮助您重新思考。

Container Classes over legacy C[] arrays