从由 const 模板参数参数化的类型转换为非 const 模板参数
Cast from type parametrized by const template argument to non-const template argument
我有一个带有可变模板参数的 class:
template<typename... Args>
class something {
public:
something(Args&&... args); // omitted for brevity
}
我有一个接受参数列表的函数和 returns 这个 class:
的一个对象
template<typename... Args>
auto make_something(Args&&... args) {
return something<Args...>(std::forward<Args>(args)...);
}
如果我这样称呼它:
something<int, std::string> s = make_something<int, std::string>(1, "");
它编译并工作正常。
但是如果我尝试传递一个 const 参数,我会得到编译错误:
const std::string t = "";
something<int, std::string> s1 = make_something(1, t); // no viable conversion from something<... const basic_string<char>> to something<... std::string>
如何成功传递 const,然后 idk,将结果转换为请求的类型,并由非 const 类型参数化?
我怀疑它与我要返回的对象的类型有关,但我实际上不知道在这种情况下用什么替换 auto
。
你可能会这样做(如果相关):
template <typename... Args>
auto make_something(Args&&... args)
{
return something<std::decay_t<Args>...>(std::forward<Args>(args)...);
}
所以你得到了 something<int, std::string>
而不是 something<int, const std::string&>
有两种选择,具体取决于您是否真的想让 something<int, const std::string &>
成为 make_something(1, t)
returns.
的类型
如果是这样,你可以有一个转换构造函数
template<typename... Args>
class something {
public:
something(Args&&... args); // omitted for brevity
template<typename... OtherArgs>
something(something<OtherArgs...>); // convert each OtherArgs into Args
}
或者,您希望 make_something(1, t)
产生 something<int, std::string>
template<typename... Args>
class something {
public:
template<typename... OtherArgs>
something(OtherArgs&&...); // use each OtherArgs for Args
}
template <typename... Args>
auto make_something(Args&&... args)
{
return something<std::decay_t<Args>...>(std::forward<Args>(args)...);
}
我有一个带有可变模板参数的 class:
template<typename... Args>
class something {
public:
something(Args&&... args); // omitted for brevity
}
我有一个接受参数列表的函数和 returns 这个 class:
的一个对象template<typename... Args>
auto make_something(Args&&... args) {
return something<Args...>(std::forward<Args>(args)...);
}
如果我这样称呼它:
something<int, std::string> s = make_something<int, std::string>(1, "");
它编译并工作正常。
但是如果我尝试传递一个 const 参数,我会得到编译错误:
const std::string t = "";
something<int, std::string> s1 = make_something(1, t); // no viable conversion from something<... const basic_string<char>> to something<... std::string>
如何成功传递 const,然后 idk,将结果转换为请求的类型,并由非 const 类型参数化?
我怀疑它与我要返回的对象的类型有关,但我实际上不知道在这种情况下用什么替换 auto
。
你可能会这样做(如果相关):
template <typename... Args>
auto make_something(Args&&... args)
{
return something<std::decay_t<Args>...>(std::forward<Args>(args)...);
}
所以你得到了 something<int, std::string>
而不是 something<int, const std::string&>
有两种选择,具体取决于您是否真的想让 something<int, const std::string &>
成为 make_something(1, t)
returns.
如果是这样,你可以有一个转换构造函数
template<typename... Args>
class something {
public:
something(Args&&... args); // omitted for brevity
template<typename... OtherArgs>
something(something<OtherArgs...>); // convert each OtherArgs into Args
}
或者,您希望 make_something(1, t)
产生 something<int, std::string>
template<typename... Args>
class something {
public:
template<typename... OtherArgs>
something(OtherArgs&&...); // use each OtherArgs for Args
}
template <typename... Args>
auto make_something(Args&&... args)
{
return something<std::decay_t<Args>...>(std::forward<Args>(args)...);
}