gpt4 book ai didi

c++ - 指定类模板参数的要求

转载 作者:搜寻专家 更新时间:2023-10-31 00:50:54 28 4
gpt4 key购买 nike

我有几个类是这样的:

struct neg_inf {
constexpr double operator()() { return -std::numeric_limits<double>::infinity(); }
};

struct pos_inf {
constexpr double operator()() { return std::numeric_limits<double>::infinity(); }
};

template<typename dX, class LowerBound, class UpperBound>
class limit {
dX dx;
UpperBound upperBound;
LowerBound lowerBound;
double step_size;

limit( dX x, LowerBound lower, UpperBound upper, double step = 1 ) :
dx{ x }, lowerBound{ lower }, upperBound{ upper }, step_size{ step }
{}

dX value() const { return dx; }
LowerBound lower() const { return lowerBound; }
UpperBound upper() const { return upperBound; }
double step() const { return step_size; }
};

到目前为止,这些类(class)按预期工作。现在我想使用条件语句修改模板参数,例如 std::enable_if_tstd::is_arithemtic std::is_same

这些是实例化限制对象需要满足的条件。

  • dX must be at least arithmetic and numerical
  • Lower & Upper bound must be either numerical, arithmetic or neg_inf or pos_inf.

例如,这些是有效的实例化:

dX = 1st and can be any: int, long, float, double, /*complex*/, etc.

limit< 1st, 1st, 1st > // default template

limit< 1st, 1st, pos_inf > // these will be specializations
limit< 1st, 1st, neg_inf >
limit< 1st, pos_inf, 1st >
limit< 1st, neg_inf, 1st >
limit< 1st, pos_inf, pos_inf >
limit< 1st, neg_inf, neg_inf >
limit< 1st, neg_inf, pos_inf >
limit< 1st, pos_inf, neg_inf >

这些是实例化我的模板的有效条件。当 UpperBound 和/或 LowerBoundinfinity 类型时,我计划部分专门化此类。当 upperlower 边界是数字 - 算术类型时,通用或默认模板将处理它们。

我的问题是,使用type_traits 库,我的类的模板声明 会是什么样子?

最佳答案

将模板类型限制为类的一种方法是为 SFINAE 添加额外的参数:

template <typename dX, class LowerBound, class UpperBound, typename Enabler = void>
class limit;

然后,提供适当的 SFINAE 特化

template <typename dX, class LowerBound, class UpperBound>
class limit<dX,
LowerBound,
UpperBound,
std::enable_if_t<my_condition<dX, LowerBound, UpperBound>::value>>
{
// ...
};

所以在你的情况下,my_condition 应该是这样的

template <typename dX, class LowerBound, class UpperBound>
using my_condition =
std::conjunction<std::is_arithmetic<dX>,
std::disjunction<std::is_arithmetic<LowerBound>,
std::is_same<LowerBound, neg_inf>,
std::is_same<LowerBound, pos_inf>>,
std::disjunction<std::is_arithmetic<UpperBound>,
std::is_same<UpperBound, neg_inf>,
std::is_same<UpperBound, pos_inf>>
>;

另一种方式是static_assert:

template <typename dX, class LowerBound, class UpperBound>
class limit
{
static_assert(std::is_arithmetic<dX>::value, "!");
static_assert(std::is_arithmetic<LowerBound>::value
|| std::is_same<LowerBound, neg_inf>::value
|| std::is_same<LowerBound, pos_inf>::value, "!");
static_assert(std::is_arithmetic<UpperBound>::value
|| std::is_same<UpperBound, neg_inf>::value
|| std::is_same<UpperBound, pos_inf>::value, "!");
// ...
};

关于c++ - 指定类模板参数的要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56657847/

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