gpt4 book ai didi

c++ - is_assignable 的可能实现

转载 作者:搜寻专家 更新时间:2023-10-31 02:21:38 25 4
gpt4 key购买 nike

我正在努力适应一些 tmp 概念。

这是检查 2 种类型是否可分配的一种解决方案:这是最重要的部分:

template<typename _Tp, typename _Up>
class __is_assignable_helper: public __sfinae_types {

template<typename _Tp1, typename _Up1>
static decltype(std::declval<_Tp1>() = std::declval<_Up1>(), __one())
__test(int) {}

template<typename, typename>
static __two __test(...) {}

public:
static constexpr bool value = sizeof(__test<_Tp, _Up>(0)) == 1;
};

现在我尝试使用其他一些 sfinae 技巧,但它不起作用..

template<typename _Tp, typename _Up, typename = void>
class __is_assignable_helper2
{

public:
static constexpr bool value = false;
};


template<typename _Tp, typename _Up>
class __is_assignable_helper2<_Tp, _Up,
typename std::enable_if<
std::is_same<typename
decltype(std::declval<_Tp>()= std::declval<_Up>(), char)
,char >::value
, void
>::type>
{

public:
static constexpr bool value = true;
};

GCC 说:错误:模板参数的数量错误(1,应该是 2)>::value

.. 他不接受 decltype 作为 is_same 中的模板参数。

有人可以解释这个错误消息吗?并提出解决方案?

更新:

好的!有用 !我写了 char ,而不是 char{}....

下一个问题:

有没有更优雅的实现方式?

最佳答案

这是一个可能的实现:

#include<type_traits>
#include<string>

template<typename T, typename U, typename = void>
struct is_assignable: std::false_type {};

template<typename T, typename U>
struct is_assignable<T, U, decltype(std::declval<T>() = std::declval<U>(), void())>: std::true_type {};

int main() {
static_assert(is_assignable<std::string, const char*>::value, "!");
static_assert(not is_assignable<const char*, std::string>::value, "!");
static_assert(is_assignable<int &, int &>::value, "!");
}

关于c++ - is_assignable 的可能实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31207284/

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