如何检测是否有一个函数。是一个constexpr?并标记其他功能。 constexpr取决于它?

时间:2016-06-23 12:40:33

标签: c++ c++11 c++14 constexpr

假设我有一些功能模板f1:

template<typename f2>
int f1(int i, int j) noexcept {
  return i + j + f2(i, j);
}

可以确定f2(i, j)是否可以是constexpr。 (无论它是函数还是函子)并将f1<f2>标记为constexpr

我想在这里使用SFINAE一些方法,但是没有找到如何使用type traits 找到constexpr

3 个答案:

答案 0 :(得分:11)

您可以将f1标记为constexpr

template<typename f2>
constexpr int f1(int i, int j) noexcept {
  return i + j + f2(i, j);
}

模板函数f1constexpr iif f2

如果f2不是,则只有在常量编译时表达式中使用f1时才会出错。

Demo

答案 1 :(得分:7)

检查某个函数(例如foo)是否为constexpr的最简单方法是将其返回值分配给constexpr,如下所示:

  constexpr auto i = foo();

如果返回的值不是constexpr,则编译将失败。

如果您想要SFINAE测试来检查某项功能(例如foo)是否为constexpr,您可以使用std::integral_constant类型特征:

std::integral_constant<int, foo()>::value

Live Demo

答案 2 :(得分:0)

所以,最后,使用 Jarod42 提示,我会编写并测试this example

#include <string>
std::string S = "123567876";

constexpr size_t p() noexcept {
  return 10U;
}

template<const size_t = size_t()>
constexpr size_t f(size_t i, size_t j) noexcept {
  return std::move(i + j + S.size() + p());
}

#include <iostream>
int main() {
  // static constexpr const auto v = f<>(1U, 2U); // error!
  std::cout << f(1U, 2U) << "\n";
  return 0;
}

现在它正常工作,我使用GCC在线编译器测试了C ++ 11和C + 14。

如果可能的话,您可以通过删除'+ S.size()'来证明它将是真正的constexpr:

...
  return std::move(i + j + p());
...

并取消注释constexpr值:

...
  static constexpr const auto v = f(1U, 2U);
  std::cout << v << "\n";
...

请参阅here

P上。谢谢你们!