通用编程时间!
如果我有一个功能:
f :: a1 -> a2 -> a3 -> ... -> an
Run Code Online (Sandbox Code Playgroud)
和一个价值
v :: aX -- where 1 <= x < n
Run Code Online (Sandbox Code Playgroud)
不知道在编译的时候,其中的参数f值v是正确的类型(如果有的话),我可以部分地适用f于v?(使用Typeable,Data,TH或任何其他技巧)
稍微坚定一点,我可以g在运行时构建函数(下面)吗?它实际上不必是多态的,我的所有类型都将是单态的!
g :: (a1 -> a2 -> a3 -> a4 -> a5) -> a3 -> (a1 -> a2 -> a4 -> a5)
g f v = \x y z -> f x y v z
Run Code Online (Sandbox Code Playgroud)
我知道,使用Typeable(typeRepArgs特别是),v是第三个参数f,但这并不意味着我有办法部分应用f.
我的代码可能看起来像: …
这是我的通用方法代码:
public static IT Activate<IT>(string path)
{
//some code here....
}
Run Code Online (Sandbox Code Playgroud)
我想设置通用IT必须只是一个接口.
这可能吗?
在C++中,假设我有一些x类型T,可以是整数或浮点类型.我想找到数量最多y类型的T为其y < x持有.需要模板化解决方案以使用整数和浮点数透明地工作.您可以忽略边缘情况,其中x已经是可以在a中表示的最小数字T.
可能的使用案例:这个问题被标记为过于本地化,因此我想提供一个我认为更通用的用例.请注意,我不是OP的原作者.
考虑这个结构:
struct lower_bound {
lower_bound(double value, bool open) : value(open? value+0.1 : value) {}
double value;
bool operator()(double x) { return x >= value; }
};
Run Code Online (Sandbox Code Playgroud)
此类模拟下限,可以打开或关闭.当然,在真实(双关语)生活中,我们不能这样做.流动是不可能的(或至少相当棘手)来计算S是所有实数.

但是,当S是一组浮点数时,这是一个非常有效的原则,因为我们基本上处理的是一个可数集; 然后没有开放或封闭的界限.也就是说,> =可以按照类似于lower_bound类的方式定义.
为了简化代码,我使用+0.1来模拟一个开放的下界.当然,0.1是原始值,因为可能存在值z,使得值<z <=值+ 0.1或值+ 0.1 = =浮点表示中的值.因此@ brett-hale答案非常有用:)
您可以考虑另一个更简单的解决方案:
struct lower_bound {
lower_bound(double value, bool open) : open(open), value(value) {}
bool open;
double value;
bool operator()(double x) { …Run Code Online (Sandbox Code Playgroud) 简单的情况,int 确实是一个数字。
我正在创建一个泛型 class test<T>
我想测试 T 以查看它是否继承自 number (或在 Dart 的情况下为 num )。
基于Object > num > int文档中的对象, 所以起初我想: T is num如果T是int. 测试int is num显示错误。我必须使用另一个关键字而不是is确定它是否是特定类的子类。
我试图将它设置为如果 T 是 num 的子级,它将处理比较不同于如果它们是字符串。
对我来说,这可以追溯到is-a和has-a关系的多态继承设计。
我正在努力做到这一点,但我遇到了一些麻烦
这是CustomProtocol
protocol CustomProtocol {
}
Run Code Online (Sandbox Code Playgroud)
SubCustomProtocol
protocol SubCustomProtocol: CustomProtocol {
}
Run Code Online (Sandbox Code Playgroud)
SubCustomProtocolImplementation
class SubCustomProtocolImplementation: SubCustomProtocol {
}
Run Code Online (Sandbox Code Playgroud)
这是CustomClass
class CustomClass<P: CustomProtocol> {
var customProtocol: P?
func doSomething() {
}
}
Run Code Online (Sandbox Code Playgroud)
SubCustomClass
class SubCustomClass<P: SubCustomProtocol>: CustomSubClass {
}
Run Code Online (Sandbox Code Playgroud)
和我的BaseViewController
class BaseViewController<P: CustomProtocol, T: CustomClass<P>>: UIViewController {
var foo: T!
override func viewDidLoad() {
super.viewDidLoad()
foo?.doSomething()
}
}
Run Code Online (Sandbox Code Playgroud)
我的ViewController
class ViewController<P: SubCustomProtocolImplementation, T: SubCustomClass<P>>: BaseViewController<P,T> {
override func viewDidLoad() {
super.viewDidLoad()
}
}
Run Code Online (Sandbox Code Playgroud)
在我称之为foo?.doSomething()的行中,它说'T'不是'CustomClass <'P'>'的子类型,我不知道我做错了什么
在ViewController声明中,它说"BaseViewController要求T继承自CustomClass <'P'>"
希望你能帮我!
在 Rust 中,有没有办法使用traits 和impls 来(递归地)展平元组?
如果有帮助的话,可以使用 N 个嵌套对的东西是一个好的开始
trait FlattenTuple {
fn into_flattened(self) -> /* ??? */
}
// such that
assert_eq!((1, (2, 3)).into_flattened(), (1, 2, 3))
Run Code Online (Sandbox Code Playgroud)
如果可以扩展任何类型的嵌套元组的工作,那就更好了:
assert_eq!(((1, 2), 2, (3, (4, 5))).into_flattened(), (1, 2, 2, 3, 4, 5))
Run Code Online (Sandbox Code Playgroud) 目标是实现一个通用的 Enum 翻译器。我知道Enum1和Enum2具有相同的值和相同的顺序。
目标是实现这样的东西:(这有效)
private static Enum1 translateEnum(Enum2 originalEnum) {
return Enum1.values()[originalEnum.ordinal()];
}
Run Code Online (Sandbox Code Playgroud)
但是我有几个枚举,所以我想制作一个通用方法:(这不起作用)
private static < T extends Enum<T>,G extends Enum<G>> T translateEnum(G originalEnum) {
return T.values()[originalEnum.ordinal()];
}
Run Code Online (Sandbox Code Playgroud)
我的问题是在T.values()编译器告诉我:
方法 values() 对于类型 T 是未定义的
你们知道我如何解决这个问题,或者你对我的问题有什么其他想法吗?
我试图通过为一个matrix类型提供一些预处理器定义来模拟C中的泛型.以下是摘录:
#define __matrix_struct(TYPE) \
struct { \
uint32_t sz; \
TYPE **ptr; \
}
#define __matrix_t(TYPE) matrix_ ## TYPE
#define __matrix_ptr_t(TYPE) __matrix_t(TYPE) *
#define __matrix_typedef(TYPE) typedef __matrix_struct(TYPE) __matrix_t(TYPE)
#define __matrix_allocator_name(TYPE) TYPE ## _matrix_alloc
#define __matrix_allocator(TYPE) \
__matrix_ptr_t(TYPE) __matrix_allocator_name(TYPE) (uint32_t sz) { \
uint32_t i; \
__matrix_ptr_t(TYPE) m = (__matrix_ptr_t(TYPE)) malloc(sizeof(__matrix_t(TYPE))); \
m->ptr = (TYPE **) malloc(sz * sizeof(TYPE *)); \
for (i = 0; i < sz; ++i) { \
m->ptr[i] = (TYPE *) calloc(sz, sizeof(TYPE)); \
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个 Spring Boot 应用程序,我想在其中按需创建和使用数据库表,而无需为它们定义实体/存储库。
我有一个基本的 Business 实体和 BusinessType 实体来保留业务类型。我希望能够为具有自己的表的业务类型(比如 Coffeeshop)动态创建一个表(同时我可以在 BusinessType 表上保留表的名称并决定从那里查询哪个表)。
因此,如果不为 Coffeeshop 定义实体和/或创建 CrudRepository,我可以创建一个名为 Coffeeshop 的表,然后对其进行一些查询吗?
如果没有,我的选择是什么?在典型的 Spring Data JPA 应用程序中,您如何处理拥有基类型并允许系统具有更多具体类型(持久化并与基类型关联)的情况?
谢谢
我正在学习 Java 中的通用编程。我在 Core Java(第 9 版)中看到了这些图表:
而且我在Java编程入门综合版第十版中看到了这些图表:
但我认为应该是这样的:
有人能告诉我我是否正确吗?