- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了以下特征模板类来确定是否可以将一种类型转换为另一种类型:
namespace Detail
{
struct IsConvertible
{
template <typename _Type, typename _OtherType>
static void convert(_OtherType);
template <typename _Type, typename _OtherType>
static auto test(_Type&&, _OtherType&&) -> decltype(convert<_Type, _OtherType>(std::declval<_Type>()), std::true_type());
static auto test(...) -> decltype(std::false_type());
};
}
template <typename _Type, typename _OtherType>
struct IsConvertible : public decltype(Detail::IsConvertible::test(std::declval<_Type>(), std::declval<_OtherType>()))
{};
然后尝试了以下测试用例:
void func1(int& i) {
}
void func2(int i) {
}
#include <iostream>
using namespace std;
int main()
{
cout << IsConvertible<int, long>::value;
cout << IsConvertible<int, float>::value;
cout << IsConvertible<int, int*>::value;
cout << IsConvertible<float, double>::value;
cout << IsConvertible<int&, int>::value;
cout << IsConvertible<int, int&>::value;
int i = 2;
int& ir = i;
int* ip = &i;
func1(i);
func2(ir);
return 0;
}
我使用的是 MSVC 2015。这些测试的输出是:
110110
它可以正确处理数字促销和转换,但在引用转换方面存在问题。这个实现有什么问题?
编辑:我更新了测试并将我的结果与 std::is_convertible 进行了比较。结果是一样的。
最佳答案
首先,你的问题有点不清楚。可以说,如果类型可以复制或移动构造,则“X &”可以转换为“X”;也可以说它们是不同的类型,不能转换。
鉴于您的一个测试用例导致 int
之间的“可转换”结果和一个 long
,我将假设您的预期结果是“松散的”。也就是说,如果有任何方法可以从 foo
进行转换至 bar
,那么结果是肯定的,您的问题在于:
cout << IsConvertible<int, int&>::value;
给出“false”的结果,但你期望:好吧,如果我有一个 int
躺着,我应该可以把它变成一个 int &
,当然,没问题。
这是我的假设。那么,让我们看看这种转换在哪里偏离了轨道:
convert<_Type, _OtherType>(std::declval<_Type>()),
您在这里使用的是 SFINAE。 _Type
是int
. _OtherType
是int &
.
顺便说一句,您不应该使用以下划线开头后跟大写字母的标识符。它们保留供 C++ 库使用。
你的 convert
模板是:
template <typename _Type, typename _OtherType>
static void convert(_OtherType);
所以,对于这个模板实例化,你要实例化
static void convert(int &);
你的调用是:
convert(std::declval<int>());
std::declval<int>
的实例化将返回一个 int,函数调用的结果为 std::declval<int>
() 将是一个右值。
此函数调用失败,因为 int
右值不能绑定(bind)到 int &
函数调用参数,只给一个const int &
范围。换句话说,有:
int declval();
void convert(int &);
以下失败:
convert(declval());
这就是您的 SFINAE 替换失败并且转换失败的原因。
我将建议一种稍微替代的方法:
template<typename Type> class TypeValue {
public:
static TypeValue param;
};
然后,而不是使用 std::declval
,使用这样的东西:
convert<_Type, _OtherType>(TypeValue<_Type>::param),
关于C++ 实现 is_convertible 和引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36415812/
假设我没有 std::is_convertible无论出于何种原因,并想自己实现。该标准说明了以下内容: The predicate condition for a template speciali
我遇到了 an implementation std::is_convertible 并且对他们为什么要测试可返回性感到困惑。以下是整个实现的摘录。为什么要将 nullptr 转换为指向返回类型 T
根据 cppreference , std::is_convertible应该表现得好像以下虚函数是良构的: template To test() { return std::declval
我创建了以下特征模板类来确定是否可以将一种类型转换为另一种类型: namespace Detail { struct IsConvertible { template
是否可以编写 std::is_convertible 的可变版本?例如are_convertible会返回 is_convertible && is_convertible .我已经考虑了几个小时,但
使用 std::is_convertible : bool i2c = std::is_convertible::value; bool c2i = std::is_convertible::valu
is_convertible 和 is_assignable 有什么区别? 为什么, 在 vs2012 中 is_convertible is false is_assignable is true
所以我想在模板类型boost::is_convertible时应用特定代码至 WellKnownType : template class Foo { public: Foo() {
在 C++11 中,可以通过 using std::is_convertible 确定类型 A 的变量是否可以隐式转换为类型 B . 如果你真的知道类型 A 和 B,这很有效,但我只有 type_in
这两个模板似乎产生相同的结果。有什么区别,我们什么时候应该使用哪个? using namespace std; class A { }; class B : public A { }; class C
当涉及 std::function 对象和 std::bind 时,我注意到 std::is_convertible 和 std::is_assignable 有一些奇怪的结果。 我假设当这些函数返回
我有以下代码: #include #include template ::value, T>::type> void func(T a) { std::cout ::value, T>::
我有一个 vector std::type_index ,表示特定节点具有的特征类型。我正在实现一个函数来检查节点是否支持特定类型。它看起来像这样: std::vector traits; ... t
我正在努力理解 std::is_convertible在 C++11 中。根据cppreference.com , std::is_convertible::value当且仅当“如果类型为 T 的虚数
template::value && is_constructible::value>, enable_if_t::value
我有 auto result = std::is_convertible , bool >::value; static_assert( result , "task sho
我是一名优秀的程序员,十分优秀!