当实参为整型时一切正常,但当实参类型为double时,除了代码块内部返回结果类型为double,代码块外部的return static_cast<int>(a - b); 依然会正常编译导致出现两个不同的返回类型而报错。 特别注意:if constexpr不支持短路规则。简单举例 template<typename T>autoany2i(T t){ifconstexpr(std::is_same<T,std:...
很明显,代码的可读性就有些被破坏了。来到C++17后,就可以使用if-constexpr了: template<typenameT>std::stringtoStr(Tt){ifconstexpr(std::is_same_v<T,std::string>)returnt;elsereturnstd::to_string(t);} 代码的可读性与上面使用enable_if相比好了许多!
出于同样的原因,在被丢弃的分支中不能有语法错误。我假设你使用GCC和-Wextra,否则我不会得到未使用的...
出于同样的原因,在被丢弃的分支中不能有语法错误。我假设你使用GCC和-Wextra,否则我不会得到未使用的...
这里讨论的是一个完善的模板规则--与允许编译器诊断template<class> void f() { return 1; }. [...
// 在ubuntu20.04,g++ 9.4.0使用 g++ -std=c++17 main.cpp编译 #include <iostream> #include <string> #include <cassert> #include <type_traits> template <typename T> void decrement_kindof(T& value) { if constexpr (std::is_same<std::string, T>::value) { value.pop_back(); } ...
这里讨论的是一个完善的模板规则--与允许编译器诊断template<class> void f() { return 1; }. [...
template<classT>auto length(T a) {usingTagType =typename T::tag;ifconstexpr (is_same<TagType, NumericTag>::value) { std::stringstream ss; ss<<a.data_; std::cout<< ss.str().length() <<std::endl; }elseif(is_same<TagType, StringTag>::value) { ...
voidprint(){autovalue =100;ifconstexpr(std::is_pointer_v<decltype(value)>)std::cout << "Ptr to " << *value << std::endl;// Errorelsestd::cout <<"Ref to "<< value << std::endl; }intmain(){print(); } I would like to know whyif constexprworks only in template f...
Code B.Withif constexpr: template<class T> void func(T argument) { // some general type-independent logic if constexpr (std::is_same<Type1,T>::value) { // do something } else { // do something else } // some general type-independent logic ...