gpt4 book ai didi

c++ - 不同类型的模板参数包

转载 作者:行者123 更新时间:2023-12-02 01:29:23 25 4
gpt4 key购买 nike

可以使以下函数模板根据参数类型实际起作用:

#include <iostream>
#include <memory>
#include <tuple>
#include <typeinfo>
using namespace std;

using UPSTR = unique_ptr<char[]>;

template<typename... Ts>
void uprint(Ts const&... strs){

auto tp = std::tie(strs...);

auto& x = std::get<0>(tp);
if(typeid(x)==typeid(UPSTR)) cout << x.get() << endl;
// Error : no match for 'operator<<' and 'const std::unique_ptr<char []>') :
else cout << x << endl;

}

int main(){
UPSTR str = make_unique<char[]>(10); str.get()[0] = 'A';
uprint(str, "hello");
return 0;
}

来自 gcc 12.2 的错误:no match for 'operator<<' and 'const std::unique_ptr<char []>')

https://godbolt.org/z/dYG9r7Koj(MSVC 确实编译了这个!)

最佳答案

编译器总是实例化函数模板的整个主体,无论是否有 if语句可以在编译时被证明是错误的。因此,任何语法/类型错误,即使是在错误分支中,也会被报告。

但正是对于这个用例,有 if constexpr :

if constexpr (std::is_same_v<std::decay_t<decltype(x)>, UPSTR>)
cout << x.get() << endl;
else
cout << x << endl;
  • typeid不是编译时构造,decltype是。
  • std::decay_t删除引用+常量 -> 更容易匹配。

请注意,从 C++20 开始,std::unique_ptr得到它的operator<<它通过 os << x.get() 准确打印其基础值所以cout<<x;变得始终有效。

关于c++ - 不同类型的模板参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73671717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com