列表中的std :: is_constructible

时间:2016-11-04 15:06:54

标签: c++ c++14

我想从我可以使用模板参数构建的列表中找到类型。在这个例子中:

using my_type = typename get_constructible<char *, int, std::string>::type;

my_type必须为std::string,因为在std::string列表中,第一个可以使用char *构建。

我试过了:

#include <string>
#include <utility>

template<typename T, typename... Rest>
struct get_constructible
{
  using type = void;
};

template<typename T, typename First, typename... Rest>
struct get_constructible<T, First, Rest...>
{
  using type = typename std::conditional<
    std::is_constructible<First, T>::value,
    First,
    get_constructible<T, Rest...>::type
  >::type;
};

int main(void)
{
  using my_type = get_constructible<char *, int, std::string>::type;
  my_type s("Hi!");
}

我不明白我的逻辑失败了。

1 个答案:

答案 0 :(得分:7)

您的逻辑看起来不错,但您在依赖名称typename上错过了get_constructible<T, Rest...>::type

using type = typename std::conditional<
  std::is_constructible<First, T>::value,
  First,
  typename get_constructible<T, Rest...>::type
//^^^^^^^^
>::type;