从由 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)...);
}