我正在编写自己的矢量类,但我遇到了问题。 我将我的类定义为模板,我有每个矢量大小的定义,我想要每个矢量大小的特定构造函数。 这是代码:
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>;
首先我可以这样做吗?如果答案是肯定的?
答案 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()