gpt4 book ai didi

c++ - 如何仅从类类型推断类构造函数的参数类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:38:13 25 4
gpt4 key购买 nike

在模板元编程中,有一个技巧:

template <typename T>
struct my_struct {};

template <typename... T1, typename... Ts>
struct my_struct <std::tuple<T1, Ts...>>
{
// Tuple is "unpacked"
// I can freely work on 'T1' & 'Ts' types (through recursion) in this scope.
using type = T1;
};

我希望成员函数(尤其是构造函数)也有类似的技巧:

template <typename T>
struct my_struct {};

// specialisation for case when type 'T' has 'T(U1, Us...)' ctor.
template <typename T, typename U1, typename... Us>
struct my_struct <
decltype(T::T(
std::declval<U1>(),
std::declval<Us>()...
))
>
{
using type = U1;
};

不幸的是,这会导致错误:

template parameter "U1" & parameter pack "Us" is not used in or cannot be deduced from the template argument list of class template "my_struct"

有什么方法可以获取 T 的构造函数参数的类型吗?


我需要上面的,因为我有一个函数 func<T>()对于类型 T 的情况,它必须“专门化”(/“重载”)有T(std::initializer_list</* ??? */>)构造函数。

template<typename T>
struct get_init_list_type_from_T_ctor
{
// magic happens here
};

template<typename T>
using has_init_list_ctor = std::enable_if_t<
std::is_constructible_v<
T,
std::initializer_list<
typename get_init_list_type_from_T_ctor<T>::type
>
>
>;

// version for T with initialization list ctor
template<
typename T,
typename = std::enable_if_t<
std::is_detected_v<has_init_list_ctor, T>
>
>
void func() {
//...
}

// version for T without initialization list ctor
template<
typename T,
typename = std::enable_if_t<
!std::is_detected_v<has_init_list_ctor, T>
>
>
void func() {
//...
}

最佳答案

不可能在 C++ 中强制执行特定的构造函数签名。

但是,如果初始化列表的类型是固定的,您仍然可以通过使用所需参数调用构造函数来使用 SFINAE:

template <typename T, typename U>
struct has_init_list_ctor
: std::is_constructible<T, std::initializer_list<U>>
{
};

template <typename T, typename U>
inline constexpr bool has_init_list_ctor_v = has_init_list_ctor<T, U>::value;

如果您不知道初始化列表的类型,这将无法工作。我们必须等待 Reflection TS。不过,如果是这样的话,我想不出这有什么用。

关于c++ - 如何仅从类类型推断类构造函数的参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57450564/

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