gpt4 book ai didi

c++ - 检查第 n 个可变参数模板参数是否属于特定类型

转载 作者:行者123 更新时间:2023-11-28 01:40:31 26 4
gpt4 key购买 nike

我想在 C++11 中实现类似 same_type() 函数的功能,如下所示(这是我迄今为止尝试过的方法,但它无法应对下面提到的用例) . 作用是检查T是否和Args的第n个参数是同一类型,目前n=0应该可以满足我的要求,虽然n=其他有意义的值(value)会更好(如果不是直截了当的话也不是很重要)。

template<typename T, typename... Args>
struct MyClass
{
// check if T is of the same type of the n-th argument of Args
bool same_type() {
// currently, I only check the first argument
// but if possible, it would be more useful to extend
// this function to check the n-th argument
return std::is_same<T,typename std::tuple_element<0, std::tuple<Args...> >::type>;
}
};

我已经看过了 this answer ,但它不考虑以下用例。

用例:

1.与引用和const限定符一起使用:

MyClass<int,const int&> c;
// expect to see 1, type of int should match const int&, i.e. reference or const should NOT affect the result
std::cout<<c.same_type();

2.不提供参数使用:

MyClass<int> c;
// expect to see 0 as there is no variadic argument provided to compare with int
std::cout<<c.same_type();

最佳答案

我建议开发一个类型特征 isSameNth 如下

template <std::size_t, typename...>
struct isSameNth;

template <std::size_t N, typename T, typename A0, typename ... As>
struct isSameNth<N, T, A0, As...> : public isSameNth<N-1U, T, As...>
{ };

template <std::size_t N, typename T>
struct isSameNth<N, T> : public std::false_type
{ };

template <typename T, typename A0, typename ... As>
struct isSameNth<0U, T, A0, As...> : public std::is_same<
typename std::remove_reference<T>::type const,
typename std::remove_reference<A0>::type const>
{ };

在模板静态方法中转换same_type()(模板值为N)

template <typename T, typename... Args>
struct MyClass
{
template <std::size_t N>
static constexpr bool same_type()
{ return isSameNth<N, T, Args...>::value; }
};

下面是一个完整的例子(符合C++11)

#include <type_traits>

template <std::size_t, typename...>
struct isSameNth;

template <std::size_t N, typename T, typename A0, typename ... As>
struct isSameNth<N, T, A0, As...> : public isSameNth<N-1U, T, As...>
{ };

template <std::size_t N, typename T>
struct isSameNth<N, T> : public std::false_type
{ };

template <typename T, typename A0, typename ... As>
struct isSameNth<0U, T, A0, As...> : public std::is_same<
typename std::remove_reference<T>::type const,
typename std::remove_reference<A0>::type const>
{ };

template <typename T, typename... Args>
struct MyClass
{
template <std::size_t N>
static constexpr bool same_type()
{ return isSameNth<N, T, Args...>::value; }
};

int main ()
{
static_assert(
false == MyClass<int, long, int, short>::template same_type<0U>(), "!");
static_assert(
true == MyClass<int, long, int, short>::template same_type<1U>(), "!");
static_assert(
false == MyClass<int, long, int, short>::template same_type<2U>(), "!");

static_assert(
true == MyClass<int const, int &>::template same_type<0U>(), "!");

static_assert(
false == MyClass<int const &>::template same_type<0U>(), "!");
}

关于c++ - 检查第 n 个可变参数模板参数是否属于特定类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47338527/

26 4 0
文章推荐: html - header-wrapper 背景图片未在 Blogger 帖子中加载
文章推荐: javascript - NodeList 更改不影响长度
文章推荐: javascript - 找到包含所有
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com