بررسی پارامتر از نوع std::vector - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

بررسی پارامتر از نوع std::vector

0 امتیاز
سلام.

آیا روشی وجود داره که تشخیص بده پارامتر ورودی از نوع std::vector هست یا نه؟
سوال شده خرداد 31, 1399  بوسیله ی AliStar (امتیاز 164)   2 20 32
دوباره تگ گذاری شد خرداد 31, 1399

2 پاسخ

+1 امتیاز
 
بهترین پاسخ

با  template specialization به راحتی قابل فهمیدن هستش به صورت زیر:

#include <stdio.h>
#include <type_traits>
#include <vector>
#include <iostream>
using namespace std;

template<typename >
struct is_std_vector: std::false_type{
    
};

template<typename T_,typename U_>
struct is_std_vector<std::vector<T_,U_>>: std::true_type{
 
};
int main()
{
    std::vector<int> vec;
    int not_vec;

    
    cout <<is_std_vector<decltype(vec)>::value << endl;
    cout << is_std_vector<decltype(not_vec)>::value << endl;
   
}

 

پاسخ داده شده تیر 1, 1399 بوسیله ی farnoosh (امتیاز 8,362)   20 44 59
انتخاب شد تیر 3, 1399 بوسیله ی AliStar
+1 امتیاز

سلام؛ زبان سی‌پلاس‌پلاس یک زبان‌ Static type هست، برای اینکه بتونید توی Runtime نوع یک نوع یا نوعی که متغیر ازش استفاده می‌کنه رو بررسی کنید می‌تونید از decltype یا typeid استفاده کنید (امّا تغییر نمی‌تونید بدید). روش‌هایی وجود داره که در زمان Compile به شما خطا بده که دارید از Type درستی برای عملیات مورد نظرتون استفاده می‌کنید یا نه. مثلاً داخل Templateها می‌تونید با استفاده از std::enable_if و Type traitsها می‌تونید نوع رو تا حد خوبی تشخیص بدید مثلاً:

 

template <typename C,
          typename T,
          typename = 
std::enable_if_t<
std::is_same_v<
std::decay_t<T>, std::vector<C>>>>
void function(const T input)
{
    std::clog << input.size() << std::endl;
}

int main()
{
    std::vector<size_t> vec_1;

    function<size_t>(vec_1);

    return 0;
}

 

پاسخ داده شده خرداد 31, 1399 بوسیله ی mg_ramezani (امتیاز 727)   1 1 12
ویرایش شده خرداد 31, 1399 بوسیله ی mg_ramezani
...