我可以编写一个constexpr函数来执行类型推导,但不使用传递给它的对象:
template <int N>
struct Foo
{
static const int value = N;
};
template <typename T>
constexpr int get_value(T const &)
{
return T::value;
}
void huey()
{
Foo<3> three;
static_assert(get_value(three) == 3, ":(");
}但是,如果get_value的参数是其他操作的结果,则此方法将失败:
template <int N>
Foo<N + 1> increase(Foo<N> const &)
{
return {};
}
void dewey()
{
Foo<6> six;
static_assert(get_value(increase(six)) == 7, ":(");
}编译器(理所当然地)抱怨increase(six)不是常量表达式。我可以这样解决这个问题:
template <typename T>
constexpr int get_value2()
{
return T::value;
}
void louie()
{
Foo<4> four;
static_assert(get_value2<decltype(increase(four))>() == 5, ":(");
}但我不喜欢额外的decltype-gymnastics。我可以引入一个宏:
#define GET_VALUE(x) get_value2<decltype(x)>()但如果可能的话,我想避免使用宏。有没有办法在没有宏的情况下使用方便的语法get_value(some_function(some_object))?
发布于 2016-07-15 21:52:53
increase()也需要是constexpr
template <int N>
struct Foo
{
static const int value = N;
};
template <typename T>
constexpr int get_value(T const &)
{
return T::value;
}
void huey()
{
Foo<3> three;
static_assert(get_value(three) == 3, ":(");
}
template <int N>
constexpr Foo<N + 1> increase(Foo<N> const &)
{
return {};
}
void dewey()
{
Foo<6> six;
static_assert(get_value(increase(six)) == 7, ":(");
}https://stackoverflow.com/questions/38397143
复制相似问题