显式模板化强制转换运算符的enable_if给出了"invalid static_cast"
enable_if on explicit templated cast operator gives "invalid static_cast"
我正在尝试做一个模板化的显式强制转换运算符。 我发现在符号上,您实际上可以将具有类型特征和std::enable_if
的表达式放在运算符的"名称"插槽中。 但以下测试没有给出所需的行为:
#include <iostream>
#include <type_traits>
class WillCast {
public:
explicit operator int () {
return 1020;
}
};
class WontCast {
public:
template <typename T>
typename std::enable_if<
std::is_same<T, int>::value, int
>::type toInteger()
{
return 1324;
}
template <typename T>
explicit operator typename std::enable_if<
std::is_same<T, int>::value, int
>::type ()
{
return 304;
}
};
int main() {
std::cout << static_cast<int>(WillCast{}) << "n"; // ok
std::cout << WontCast{}.toInteger<int>() << "n"; // ok
/* std::cout << static_cast<int>(WontCast{}); */ // error
};
从 gcc 4.8.2 返回的错误是:
test.cpp: In function ‘int main()’:
test.cpp:27:45: error: invalid static_cast from type ‘WontCast’ to type ‘int’
std::cout << static_cast<int>(WontCast{});
如果我试图做的事情是不可能的,我不会感到惊讶。 但它似乎认为语法没问题,只是在WontCast::toInteger()
和WillCast::operator int()
看到的"附近"行为之间似乎表现不一致。
(这是一个简化的示例,当然我想要的enable_if
更棘手。
更新 - "侧边栏智能(tm)"抛出 如何在转换运算符中使用 std::enable_if? 我没有通过"之前你问的情报(tm)"找到。 我会看看它是否有帮助。 好吧,那里使用的解决方案似乎不适用,因为 WontCast 不是一个模板化类。 所以在这里没有帮助。
如果将enable_if
部分移动到模板中,则此方法有效:
template <typename T,
typename = typename std::enable_if<std::is_same<T, int>::value>::type
>
explicit operator T()
{
return 304;
}
鉴于:
int i = static_cast<int>(WontCast{}); // ok
double d = static_cast<double>(WontCast{}); // invalid static_cast
相关文章:
- 如何理解C++标准N3337中的expr.const.cast子句8
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- C++Cast运算符过载
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 我似乎对if/else的基本语句有问题:/
- if数组上的随机数
- 将按位if条件转换为普通if条件
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 使用if-else将数字转换为单词
- 为什么简单的算术减法在"if"条件下不起作用?