模板和is_same()不起作用?
Template and is_same() doesn't work?
if (std::is_same<T, float>::value)
{
float a;
somefunc_float(x,len,&a);
}
上面的代码来自一个模板,它接受一个指针x,可以是一些原始数据类型的指针(例如x是double *
, float *
或int *
),而somefunc_float
来自一个库,只能接受x
的一个特定的数据类型(float *
在上面的例子中),编译器总是给我错误,告诉我输入的数据类型(x)是不正确的,好像表达式std::is_same<T, float>::value
不工作吗?
现在我们有了c++ 17,您的方法就有效了。然而,需要一个微小但至关重要的修正:
// is_same_v is an alias for is_same<...>::value
if constexpr (std::is_same_v<T, float>) {
float a;
somefunc_float(x,len,&a);
}
if constexpr
是常规if语句的编译时求值变体,在某种程度上类似于预处理器#if
。
问题的描述不完全清楚,但我想我理解你想要做的:你在模板函数中包含一个代码块,可以在编译时执行测试,并期望编译器将丢弃该块而不编译它。
模板不是这样工作的。当模板被实例化时,整个模板被检查和编译,代码必须是正确的,然后优化器才能丢弃代码块(在这种情况下很可能会这样做)。
获得该行为的常见方法是提供使用不同类型调用的模板(或非模板重载)的多个实现。编译器将在调用的地方调度到适当的实现,然后忽略其余部分。在未来的c++版本(可能是c++ 17)中有关于static if
功能的建议,它将支持您正在尝试做的事情。
类型是静态确定的,所有实例化的模板代码必须编译,即有意义。if
语句的内容必须有意义,即使条件为false。
试试这样写:
template <typename T> execute_if_float(T) { }
execute_if_float(float x) { somefunc_float(x); }
template <typename T> void myCode(T x)
{
// ...
execute_if_float(x);
// ...
}
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- 为什么这段代码不起作用,我该如何解决?
- 我正在开发服务器,ip作为参数传递不起作用