所以我现在是一名学生,并参加了以下练习: 编写一个打印数组中元素的函数。数组通过参数发送到函数。如果此参数不是数组,则必须抛出类型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()
函数而不是数组。
我对代码的计划是将arrChars
和s
换成printArray()
的参数,以确定该计划的成功。
答案 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 []数组,那么这篇文章可能会帮助您重新思考。