特定于模板的构造函数

时间:2015-05-06 12:54:23

标签: c++ windows-runtime c++-cx

我正在编写自己的矢量类,但我遇到了问题。 我将我的类定义为模板,我有每个矢量大小的定义,我想要每个矢量大小的特定构造函数。 这是代码:

    template<int size>
ref class Vector
{
internal:

    Vector(int _x, int _y, int _z, int _w);
private:

    float *m_data = new float[4];
};

,定义是:

using Vector2 = Vector<2>;
using Vector3 = Vector<3>;
using Vector4 = Vector<4>;

首先我可以这样做吗?如果答案是肯定的?

3 个答案:

答案 0 :(得分:0)

如果你真的想要为每个模板实例提供不同的行为,你可以这样做:

var _data = [];

答案 1 :(得分:0)

如果需要通用接口,请将构造函数定义为具有4个参数并对其进行特化。在里面,只初始化那些对这个大小的矢量有效的成员:

template <>
Vector<1>::Vector(int _x, int _y, int _z, int _w)
: x(_x) //1D vector has only 'x'
{
}

template <>
Vector<2>::Vector(int _x, int _y, int _z, int _w)
: x(_x)
, y(_y) //2D vector has 'x' and 'y'
{
}

等。但那丑陋,迫使你做出一些事情和共同的事情,例如你甚至会为4保留2D vector个组件。有变通方法(模板化结构用作成员变量,专门用于每种尺寸的矢量),但这更复杂。由于不同大小的矢量实际上是不同类型,我会选择全班专业化:

template<int size>
class Vector;

template<>
class Vector<1>
{
protected:
    int x;

public:
    Vector(int _x)
    : x(_x)
    { }

    //other members
};

template<>
class Vector<2>
{
protected:
    int x, y;

public:
    Vector(int _x, int _y)
    : x(_x)
    , y(_y)
    { }

    //other members
};

然后你可以这样使用它:

Vector<1> v_1(2);
Vector<2> v_2(4, 6);
//etc...

此外,第二种解决方案将允许向量的客户端仅为您明确允许的那些size实例化它。

答案 2 :(得分:0)

使用C ++ 11,您可以执行以下操作:

box.df <- df %>% group_by(fact) %>% do({
  stats <- as.numeric(quantile(.$val, c(0, 0.25, 0.5, 0.75, 1)))
  iqr <- diff(stats[c(2, 4)])
  coef <- 1.5
  outliers <- .$val < (stats[2] - coef * iqr) | .$val > (stats[4] + coef * iqr)
  if (any(outliers)) {
    stats[c(1, 5)] <- range(c(stats[2:4], .$val[!outliers]), na.rm=TRUE)
  }
  outlier_values = .$val[outliers]
  if (length(outlier_values) == 0) outlier_values <- NA_real_
  res <- as.list(t(stats))
  names(res) <- c("lower.whisker", "lower.hinge", "median", "upper.hinge", "upper.whisker")
  res$out <- outlier_values
  as.data.frame(res)
})
box.df
## Source: local data frame [2 x 7]
## Groups: fact
## 
##   fact lower.whisker lower.hinge median upper.hinge upper.whisker out
## 1    a             2        3.25    5.0        9.00            10 101
## 2    b             1        5.50    7.5        8.75             9 100

ggplot(box.df, aes(x = fact, y = out, middle = median,
                   ymin = lower.whisker, ymax = upper.whisker,
                   lower = lower.hinge, upper = upper.hinge)) +
  geom_boxplot(stat = "identity") + 
  geom_point()