【问题标题】:how to construct class whose constructor function might have multiple parameter or none in template?如何构造其构造函数在模板中可能有多个参数或没有参数的类?
【发布时间】:2014-10-25 05:39:19
【问题描述】:

现在我想写一个可以实例化类的通用模板,当然,这些类可能没有参数或有多个参数。所以模板必须有可变参数。有人可以帮帮我吗?

为了更好的理解,请看下面的简单代码sn-p,我不知道怎么弄:

class Print
{
public:
    Print(const char* param, const char* param2)
        : m_str1(param)
        , m_str2(param2)
    {}
    void outPut()
    {
        std::cout << m_str1 << "\t" << m_str2 << std::endl;
    }
private:
    std::string m_str1;
    std::string m_str2;
};

template<typename ... Ts>
struct adapter
{
    static void invoke()
    {
        C t((Ts::value)...); // make a instance on the fly
    }
};

更新: 当我尝试编写这样的代码时,它不会编译:

adapter<const char*, const char*>;

【问题讨论】:

  • 您遇到了什么问题?
  • @VaughnCato,看看我的更新
  • 看起来您正在尝试创建Ts 类型的任意实例,但我怀疑您想要真正的值。如果Tsconst char *,您希望字符串值是什么?有一个更完整的问题示例(带有一个主要的)可能会让你更清楚你想要做什么。
  • @VaughnCato,看到我之前问过的这个问题,它包含完整的上下文,stackoverflow.com/questions/25580294/…
  • 好的,这没什么大不了的:ideone.com/A0qdSW

标签: templates visual-c++ visual-studio-2012 c++11


【解决方案1】:

你正在寻找这样的东西:

template<typename T>
struct adapter
{
    template<typename ... Ts>
    static T invoke(Ts&& ... ts)
    {
        return T(std::forward<Ts>(ts)...); // make a instance on the fly
    }
};

要创建T 类型的对象,您可以使用适当的参数调用adapter&lt;T&gt;::invoke

【讨论】:

  • 已修复。您还需要包含标题&lt;utility&gt;
  • 还有一个问题,如果我删除 '&&' 会怎样?它仍然可以编译。 '&&'有什么用?
  • 这利用了 C++11 的引用折叠规则,允许右值和左值绑定到函数参数。 std::forward 确保此信息正确转发到下一个函数。
  • 如果不使用'&&'会有什么不好的影响吗?
猜你喜欢
  • 1970-01-01
  • 2018-05-18
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 2016-09-02
  • 1970-01-01
  • 2019-06-04
相关资源
最近更新 更多