【问题标题】:Can a C++ templated function choose a member variable?C++ 模板函数可以选择成员变量吗?
【发布时间】:2015-12-11 16:37:14
【问题描述】:

我希望一个类有一个带有模板参数的函数,并根据该模板参数操作特定的成员变量。

例如,如果允许函数模板特化,则如下所示:

struct A
{
    struct M1 {};
    struct M2 {};

    // Function template specialization not allowed :(
    template<typename M>
    void addM(M const &m);

    template<>
    void addM(M1 const &m)
    {
        m1_vec_.push_back(m);
    }

    template<>
    void addM(M2 const &m)
    {
        m2_vec_.push_back(m);
    }

    std::vector<M1> m1_vec_;
    std::vector<M2> m2_vec_;
};

有什么想法吗?我觉得我错过了一些简单的东西,但又不能完全理解它。

【问题讨论】:

  • 为什么不使用M1M2 的重载函数?
  • C++ 让人们很容易错过树木中的木头。 ;-)
  • 附带说明,函数模板可以专门化(完全)。这段代码失败的原因是它们不能在类范围内特化。
  • 虽然重载是(大部分时间)在这种情况下的方法,但模板看起来更好的解决方案的一种情况是重载使用完全相同的代码,唯一的区别是使用的成员.这对于单行方法来说没什么大不了的,但是将所有代码复制到更复杂的方法中就更麻烦了。
  • @SergeyA 上面的代码在VS2013中编译。我认为代码是有效的,struct 本身不是模板。

标签: c++ function templates specialization


【解决方案1】:

只是重载它们:

struct A
{
    struct M1 {};
    struct M2 {};

    void addM(M1 const &m)
    {
        m1_vec_.push_back(m);
    }

    void addM(M2 const &m)
    {
        m2_vec_.push_back(m);
    }

    std::vector<M1> m1_vec_;
    std::vector<M2> m2_vec_;
};

如果您不想复制addM 的代码,您可以将向量选择抽象到另一个函数后面:

struct A
{
    struct M1 {};
    struct M2 {};

    template <class T>
    void addM(T const &m)
    {
        getVec<T>().push_back(m);
    }

    std::vector<M1> m1_vec_;
    std::vector<M2> m2_vec_;

private:
    template<class T>
    std::vector<T> &getVec();
};

template <>
std::vector<A::M1> &A::getVec() { return m1_vec_; }

template <>
std::vector<A::M2> &A::getVec() { return m2_vec_; }

【讨论】:

  • 第二个答案完全是我想要的。无论我在 C++ 方面做得多么出色,总让我感到惊讶的是,有些人做得更好。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
相关资源
最近更新 更多