使用SFINAE检测实例方法constexpr

时间:2016-02-05 19:27:41

标签: c++ c++11 template-meta-programming

首先让我先注意这里非常相似的问题:Detecting constexpr with SFINAE。不同之处在于,在这个问题中,检测方法可以检测类的静态方法。

我正在尝试检测是否可以构造constexpr副本。我非常接近,这就是我所拥有的:

template <class T>
constexpr int return_int(T t) {  return 0; }

template <class T>
T& unmove(T&& t) { return t; }

template <class ... T>
using void_t = void;

template <class T, class = void>
struct is_constexpr_copy_constructible : std::false_type {};

template <class T>
struct is_constexpr_copy_constructible<T, void_t<
                                              std::integral_constant<int, 
                                                  return_int(unmove(T{}))
                                              >
                                          >> : std::true_type {};

此解决方案中思想的逻辑进展如下:

  1. 只有常量表达式整数可用于整数模板参数。
  2. 如果函数是constexpr并且其所有参数都是constexpr,则函数调用的结果仅被视为constexpr。
  3. 按价值传递内容需要制作副本。
  4. 所以我写了函数return_int,它给了我一个constexpr整数iff如果传递了constexpr复制构造函数的constexpr表达式。 unmove只是确保调用复制构造函数而不是移动构造函数。

    问题是,为了首先获得表达式,我必须创建我的类型。我不能使用declval作为TMP中的标准,因为这不是一个未评估的上下文;实际上将在编译时评估return_int以计算类型。所以我坚持使用一个元函数来检测一个类型是否是constexpr copy constructible和constexpr默认可构造的。

    这不是世界末日本身,因为这些东西往往会重叠,但它并不理想。有没有办法解决?从根本上说,它归结为:

    1. 我没有看到任何方法来验证某些东西是否在未评估的背景下是constexpr。
    2. 在评估的上下文中,我没有看到任何方法来获取我测试类型的实例,以便尝试在不调用构造函数的情况下进行复制。
    3. 请注意,在我链接的类似问题中,这根本不是问题,因为它正在检查静态方法,因此不需要实例。

      帮助?

0 个答案:

没有答案