gpt4 book ai didi

c++ - 如何克服 MSVC 成员方法指针模板参数推导失败的 bug?

转载 作者:行者123 更新时间:2023-12-01 18:36:07 25 4
gpt4 key购买 nike

下面是一个最小的代码 compiles in g++ ,但给出 error in MSVC :

template<typename Type,
typename Return, // <--- error: this is not deduced
typename Container,
typename Parameter>
Container
StringTo (Type&& copy,
const char tokens[],
Return (Container::*Insert) (const Parameter&))
{
static_assert(not std::is_lvalue_reference<Type>::value, "Must be rvalue.");
Container container;
return container;
}

template<typename Type>
auto
StringToVector (Type&& copy,
const char tokens[])
{
static_assert(not std::is_lvalue_reference<Type>::value, "Must be rvalue.");
return StringTo(std::move(copy), tokens, &std::vector<Type>::push_back); // <--- here
}

int main()
{
auto v = StringToVector(std::string("hello world"), " ");
}

根据这篇文章,这是 MSVC 中的一个错误,尚未修复:Visual Studio 2017 - could not deduce template argument (with variadic templates)

问题:解决此特定情况的解决方法是什么?

<小时/>

更新:此错误无法修复,并且我愿意更改设计/界面。欢迎您将其作为答案发布。会接受最好的。

最佳答案

通过将想要的容器类型添加到StringTo的模板参数列表中,然后将函数作为泛型类型,可以在StringToVector中使用lambda进行转发到正确的成员函数。这看起来像

template<typename Container,
typename Type,
typename Func>
Container
StringTo (Type&& copy,
const char tokens[],
Func func)
{
static_assert(not std::is_lvalue_reference<Type>::value, "Must be rvalue.");
Container container;
func(container, std::move(copy));
return container;
}

template<typename Type>
auto
StringToVector (Type&& copy,
const char tokens[])
{
static_assert(not std::is_lvalue_reference<Type>::value, "Must be rvalue.");
return StringTo<std::vector<Type>>(std::move(copy), tokens, [](auto& cont, auto&& val){ cont.push_back(std::move(val)); } ); // <--- here
}

int main()
{
auto v = StringToVector(std::string("hello world"), " ");
}

您可以在此处看到它在 Rextester 上运行:https://rextester.com/BLSS95194

关于c++ - 如何克服 MSVC 成员方法指针模板参数推导失败的 bug?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58377080/

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