gpt4 book ai didi

c++ - 选择第一个定义类型的模板表达式

转载 作者:太空狗 更新时间:2023-10-29 21:47:24 28 4
gpt4 key购买 nike

我需要一个模板表达式,如果定义了第一个参数,则选择第一个参数类型,否则选择第二个参数类型。

select<int, float>::type               // type evaluates to int
select<an_undefined_type, float>::type // type evaluates to float

... 并且该解决方案必须与 C++03 和 Boost 1.33.1 一起使用 :(

我的目标是同时接受 intboost::optional<int>作为函数模板参数 T ,所以我可以做类似的事情:

template<typename T>
void fn(T& t)
{
int x = std::numeric_limits<select<T::value_type, T>::type>::digits;
}

boost::optional<int>::value_type已定义。

C++11 解决方案也很受欢迎。

我看不到使用模板特化来实现这一点的方法,因为我试图专注于概念而不是类型。基本上,我需要一个与 any_integer 相匹配的特化。与 boost::optional<any_integer> 匹配的概念和特化概念。

我想使用 C++11 我可以通过以下方式实现这个特定目标:

std::conditional<std::is_integral<T>::value, T, T::value_type>::value

但我没有 C++11,我想要更通用的解决方案。

最佳答案

我认为您无法获得您正在寻找的确切符号。但是,我认为您可以使用稍微不同的符号来实现语义上的目标。您当前的符号问题

int x = std::numeric_limits<select<T::value_type, T>::type>::digits;

select<T0, T1>吗期望两种类型,即,存在类型的要求不在 select<T0, T1> 上模板,但在调用它的函数上。我要改变的方法是使用

int x = std::numeric_limits<select<typename get_value_type<T>::type, T>::type>::digits;

现在所有需要发生的就是拥有一个get_value_type<T>产生嵌套类型(如果存在)和某种类型 select<T0, T1>如果到达那里将被忽略,例如 void (或自定义标记类型)。 get_value_type<T>模板应该相当简单(我看到了 Dirk Holsopple's answer 但我无法让它工作):

template <typename T>
struct has_value_type
{
typedef char (&true_type)[1];
typedef char (&false_type)[2];
template <typename D> static true_type test(typename D::value_type*);
template <typename D> static false_type test(...);

enum { value = sizeof(test<T>(0)) == 1 };
};

template <typename T, bool = has_value_type<T>::value >
struct get_value_type
{
typedef T type; // EDIT
};

template <typename T>
struct get_value_type<T, true>
{
typedef typename T::value_type type;
};

显然,您可能希望定义稍微不同的类型特征,这样您就可以使用类似的东西

int x = std::numeric_limits<typename get_type<T>::type>::digits;

如果有 value_type,这将返回嵌套类型和一个类型 T否则。

关于c++ - 选择第一个定义类型的模板表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13322227/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com