c++ - is_assignable 的可能实现

标签 c++ sfinae tmp

我正在努力适应一些 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/

相关文章:

c++ - 使用 SFINAE、约束或概念来限制特化?

java - 什么是 jartmp 文件?

c++ - Qt 使用 singleShot Timer 从 QGraphicsScene 中删除 QGraphicsItem?

c++ - 为 Windows 编译的 Qt 是 Low Level 的 win api

c++ - 损坏的双链表 : 0x0804d0c0 (C++)?

c++ - 如何检测类中是否存在特定的成员变量?

c++ - 是否可以仅通过标识符检查成员模板的存在?

tmp - 如何在当前工作目录中使用 mktemp 创建临时目录?

linux - 临时重命名/tmp 然后创建到不同位置的 tmp 符号链接(symbolic link)是否安全?

c++ - 声明 "namespace std {}"的目的是什么?