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