是否有可能让编译器使用类型转换或演绎指南来演绎模板函数调用的类型?如果没有,原因是什么?
#include <iostream>
template<typename T>
class Wrapper
{
public:
Wrapper(T&& elmt)
: m_data(std::forward<T>(elmt))
{ }
const T& data() const
{
return m_data;
}
private:
T m_data;
};
template<typename T>
Wrapper(T&& elmt) -> Wrapper<T>;
template<typename T>
void someFunc(const Wrapper<T>& wrapper)
{
std::cout << wrapper.data() << std::endl;
}
int main()
{
// Any chance this could work?
// someFunc("Make me a Wrapper<const char*> please!"); //fails
// someFunc({"Make me a Wrapper<const char*> please!"}); //fails
// This works, but that's what I'd like to avoid
someFunc(Wrapper{"This one works"});
return 0;
}
(编译器资源管理器链接:https://godbolt.org/z/eGs3raMY4)
如果Wrapper不是模板,则可以直接执行以下操作:
#include <iostream>
class StrWrapper
{
public:
StrWrapper(const char* str)
: m_data(str)
{ }
const char* data() const { return m_data; }
private:
const char* m_data;
};
void strFunc(const StrWrapper& wrapper)
{
std::cout << wrapper.data() << std::endl;
}
int main()
{
strFunc("This works, right?");
return 0;
}
(编译器资源管理器:https://godbolt.org/z/nnoaPcs91)
我知道我可以为每种类型添加一个重载,但是在这种情况下,这不是一个非常实用的解决方案(需要许多重载)。
2条答案
按热度按时间0s0u357o1#
有没有可能让编译器使用类型转换或推导指南来推导模板函数调用的类型?
你可以用递归的方法
这允许两者
See a live demo in godbolt.org
6ovsh4lw2#
您可以让
someFunc
接受 Package 器,然后在函数内部构造 Package 器,如下所示它允许
如live example所示进行编译。
原因是
失败的原因是它们不是
Wrapper
的,并且编译器不会尝试转换参数,因此编译器无法推断T
应该是什么。