我有一个带有乘法的最小表达模板库,即
template <typename T, typename U>
struct mul {
const T &v1;
const U &v2;
};
template <typename T, typename U>
mul<T, U> operator*(const T &one, const U &two) {
std::cout << " called: mul<T, U> operator*(const T &one, const T &two)\n";
return mul<T, U>{one, two};
}
Run Code Online (Sandbox Code Playgroud)
并转置,即
template <typename T>
struct transpose {
const T &t;
};
template <typename T>
transpose<T> tran(const T &one) {
return transpose<T>{one};
}
Run Code Online (Sandbox Code Playgroud)
我将介绍一些type A和B,其中后者是前者的子类:
template <typename T>
struct A { …Run Code Online (Sandbox Code Playgroud) 这是我的问题.我只是好奇在限制可以传递给泛型函数或类的类型方面的共识.我以为我曾经读过,如果你正在进行通用编程,通常最好先把东西打开而不是试图关闭它们(不记得来源).
我正在编写一个具有一些内部泛型函数的库,我觉得它们应该只允许库中的类型与它们一起使用,因为这就是我的意思.另一方面,我不确定我将锁定事情的努力值得.
任何人都可能有一些关于这个主题的统计数据或权威评论?我也对合理的意见感兴趣.希望这并不能完全解决这个问题:
此外,SO上是否有任何标签等同于"最佳实践"?我没有特别看到那个,但似乎能够提出给定SO主题的所有最佳实践信息是有帮助的......也许不是,只是一个想法.
编辑:到目前为止,一个答案提到我正在做的库的类型将是重要的.它是一个数据库库,最终使用STL容器,variadics(元组),Boost Fusion,这种性质的东西.我可以看到这是如何相关的,但我也会对确定走哪条路的经验法则感兴趣.
我写了一个通用类:
public class Interval<T> where T : IComparable // for checking that Start < End
{
public T Start { get; set; }
public T End { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
我使用这个类与DateTime,int等.
我需要一个Duration属性,返回一个持续时间,如:
public object Duration
{
get
{
return End - Start;
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我的类中包含此属性时,编译器会在运算符上引发逻辑错误-.
我能做些什么来正常实现这个目标,还是应该忽略它?
我正在寻找一个允许数据类型泛型编程的Scala库(例如Scrap Your Boilerplate).具有适当链接和每个简短描述的库列表将是一个完美的答案.
花了一些时间在Haskell和其他函数式语言中玩,我开始意识到设计的简单性来源于描述一般问题.虽然模板编程的许多方面可能远非简单,但有些用法很常见,我认为它们不会妨碍清晰度(尤其是函数模板).我发现模板通常可以简化当前设计,同时自动添加一些未来阻力.为什么他们的功能应该降级为图书馆作家?
另一方面,有些人似乎避免像瘟疫这样的模板.十年前,当泛型类型的概念对于大多数编程社区而言是陌生的时候,我能理解这一点.但是现在所有流行的静态类型OO语言都支持这种或那种形式的泛型.增加的熟悉程度似乎需要调整保守态度.
我最近向我表达了一种这样的保守态度:
你永远不应该做出比必要更通用的东西 - 软件开发的基本规则.
我真的很惊讶地看到这种说法如此夸张,好像应该是不言自明的.就个人而言,我发现它远非不言自明,对于像Haskell这样的语言,除非你另有说明,否则一切都是通用的.话虽如此,我想我明白这种观点来自哪里.
在我的脑海里,我确实有类似的规则在喋喋不休.现在它处于最前沿,我意识到我总是根据整体架构来解释它.例如,如果您有一个类,则不希望使用您可能有一天使用的大量功能加载它.如果你只需要一个具体的版本,就不要费心去做接口(虽然可模拟性可能是对这个版本的反驳).像这样的东西...
然而,我不做的是在微观层面上应用这一原则.如果我有一个小实用程序函数,没有理由依赖任何特定类型,我将创建一个模板.
所以你觉得怎么样?您认为过度概括是什么?根据具体情况,此规则是否具有不同的适用性?你甚至同意这是一个规则吗?
只是尝试这个问题,我在过去的考试试卷中发现,这样我就可以为即将进行的Java考试做准备.
提供用于表示事物对的通用类Pair.该类应该提供一个构造函数,一个获取该对的第一个成员的方法,一个获取该对的第二个成员的方法,一个用于设置该对的第一个成员的方法,一个用于设置该对的第二个成员的方法.该类应该针对第一个成员的两个类型进行参数化,并且对于该对的第二个成员进行参数化.
这是这个问题的正确实现吗?
public class Pair<firstThing, secondThing>{
private firstThing first;//first member of pair
private secondThing second;//second member of pair
public Pair(firstThing first, secondThing second){
this.first = first;
this.second = second;
}
public void setFirst(firstThing first){
this.first = first;
}
public void setSecond(secondThing second) {
this.second = second;
}
public thing getFirst() {
return this.first;
}
public thing getSecond() {
return this.second;
}
}
Run Code Online (Sandbox Code Playgroud) 我想Map<String, List<String>>在Java中实例化,
我试过了
Map<String, List<String>> foo = new <String, List<String>>();
Run Code Online (Sandbox Code Playgroud)
和
Map<String, List<String>> foo = new <String, ArrayList<String>>();
Run Code Online (Sandbox Code Playgroud)
他们都没有工作.有没有人知道如何在Java中实例化这个地图?
我是编程方面的新手,我遇到了R与泛型函数有关的问题:有多个输入时如何编写?
举一个简单的例子,关于数据集和函数
z <- c(2,3,4,5,8)
calc.simp <- function(a,x){a*x+8}
# Test the function:
calc.simp(x=z,a=3)
[1] 14 17 20 23 32
Run Code Online (Sandbox Code Playgroud)
现在,我更改z的类:class(z)<-'simp'因为有两个输入,我应该如何编写泛型函数'calc'?我的尝试和错误如下:
calc <- function(x) UseMethod('calc',x)
calc(x=z)
Error in calc.simp(x = z) : argument "a" is missing, with no default
Run Code Online (Sandbox Code Playgroud)
和
calc <- function(x,y) UseMethod('calc',x,y)
Error in UseMethod("calc", x, y) : unused argument (y)
Run Code Online (Sandbox Code Playgroud)
因为我只是一个初学者,所以我的困惑可能是根本的困惑。请帮忙!非常感谢你!
我已经在Haskell编程语言中使用了Scrap Your Boilerplate和Uniplate库,我会发现通过有区别的联合的泛型编程形式非常有用.f#编程语言中是否有等效的库?
我正在开发一个自定义视图,希望可重用.它应该具有泛型类型,如下所示:
public class CustomViewFlipper<someType> extends ViewFlipper { }
Run Code Online (Sandbox Code Playgroud)
我知道如何将普通的自定义视图绑定到XML文件.但我找不到这种情况的任何例子.有没有办法为XML中的类定义泛型类型?