2015-08-13 2 views
0

Итак, я в настоящее время участвую в этом упражнении: Напишите функцию, которая печатает элементы в массиве. Массив передается функции по аргументу. Если этот аргумент не является массивом, должно быть выбрано исключение типа invalid_argument. Проверьте функцию в функции main().Как проверить, является ли тип данных массивом? (C++)

Так что мой код в настоящее время выглядит следующим образом:

#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(), которые не являются массивами.

Мой план с кодом состоит в замене arrChars и s в качестве аргументов printArray(), чтобы определить успех программы.

ответ

7

Если этот аргумент не является массивом, должно быть выбрано исключение типа invalid_argument.

Это ... странная вещь, которую нужно делать на C++. Обычно мы будем искать «если этот аргумент не является массивом, код не должен компилироваться». Но эй, мы тоже можем это сделать. Просто напишите одну перегрузку функции, которая принимает массив, и тот, который берет что-нибудь:

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"); 
} 
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 
+0

Это не компилируется, если вы прошли не-контейнер, хотя. – Barry

+0

@Barry Это очень хорошо, если он не будет компилироваться. :) –

-1

«Написать функция, которая печатает элементы в массиве «

Когда вы говорите «массив», мы говорим о массиве 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

Смежные вопросы