标签: generic-programming

Scala:实现Numeric的子类型[T]

如何实现Numeric [T]的子类型?我一直在寻找这方面的指南,但没有找到任何.子类型的例子可能是Rational还是Complex?

在此先感谢Troels

scala generic-programming scala-2.8

7
推荐指数
1
解决办法
1403
查看次数

模板模板总专业化

模板模板规范是这样的:

template < template < class > class T >
struct MyTemplate
{
};
Run Code Online (Sandbox Code Playgroud)

我该如何为这个模板创建一个全部(或部分)专业化?这可能吗?

c++ templates generic-programming

7
推荐指数
1
解决办法
965
查看次数

以通用方式在Scala集合上运行

我写了函数来找到最长的公共子序列(LCS).例如,对于两个字符序列BANANA和ATANA,它返回AANA.实现是递归算法的天真低效适应,但它与此问题的目的无关.

def LCS[T](a: Seq[T], b: Seq[T]): Seq[T] = {
    if (a.isEmpty || b.isEmpty)
      Seq.empty
    else if (a.head == b.head)
      a.head +: LCS(a.tail, b.tail)
    else {
      val case1 = LCS(a.tail, b)
      val case2 = LCS(a, b.tail)
      if (case1.length > case2.length) case1 else case2
    }
}
Run Code Online (Sandbox Code Playgroud)

我想以最通用的方式重构此函数.当前实现适用于任何类型的输入序列,但始终返回List [T]类型的集合.我想实现以下行为:

LCS(List('B','A','N','A','N','A'), List('A','T','A','N','A')) -> List('A','A','N','A')
LCS(Vector('B','A','N','A','N','A'), Vector('A','T','A','N','A')) -> Vector('A','A','N','A')

...and so on for all other Seqs...

如果LCS也可以处理StringArray,那将是很棒的:

LCS("BANANA", "ATANA") -> "AANA"
LCS(Array('B','A','N','A','N','A'), Array('A','T','A','N','A')) -> Array('A','A','N','A')

我相信在Scala …

generics types scala generic-programming scala-collections

7
推荐指数
1
解决办法
1450
查看次数

哪种方式更适合在C中创建与类型无关的结构?

我正在尝试编写一些通用结构.基本上,我需要的是C++模板,但由于我是用C语言编写的,因此不考虑模板.目前我正在考虑实现我想要的两种方式.

方法1:使用预处理器.像这样:

#define DEFINE_PAIR(T) typedef struct Pair_##T{ \
                           T x; \
                           T y; \
                        } Pair_##T

DEFINE_PAIR(int);

int main(){
   Pair_int p;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

一个明显的缺点是你必须在使用类型之前调用宏.可能还有更多的缺点,我希望你能指出.

方法2:只使用void-pointers,如下所示:

typedef struct Pair{
   void* x;
   void* y;
} Pair;
Run Code Online (Sandbox Code Playgroud)

显然,这种方法不是类型安全的(我可以轻松地将一对字符串传递给期望一对双精度的函数),而且使用这种方法进行重新分配的代码变得更加混乱.

我想听听你对此的看法.这两种方法中哪一种更好/更差?为什么?有没有其他方法可以用来在C中编写通用结构?

谢谢.

c types generic-programming

7
推荐指数
1
解决办法
1182
查看次数

C++:为什么decltype(*this)返回一个引用?

template<typename T>
struct foo{
    void f(){
        decltype(*this) a(*this);
        do_some_test(a);
    }
    T data;
};
//compiler won't accept this
Run Code Online (Sandbox Code Playgroud)

在我的解释中,decltype应该返回一个类型,以便我们可以在声明中使用它.但谷歌表示,在decltype(x),如果x是一个左值,它将返回T&这里T是x的类型.

但他们设计的是什么来返回参考?此外,我应该怎么做才能创建与*this模板中的类型相同的类的实例?

c++ templates generic-programming

7
推荐指数
1
解决办法
3661
查看次数

copy_backward和reverse_copy之间的区别?

我正在阅读C++入门并看到这两个似乎具有相同功能的函数.谁能帮忙告诉我两者有什么区别?谢谢.

c++ stl generic-programming c++-standard-library

7
推荐指数
1
解决办法
1138
查看次数

Rust中数字功能的特性

是否有任何特征指定一些数字功能?我想用它来绑定泛型类型,就像这个假设HasSQRT:

fn some_generic_function<T>(input: &T)
    where T: HasSQRT
{
    // ...
    input.sqrt()
    // ... 
}
Run Code Online (Sandbox Code Playgroud)

numeric traits generic-programming rust

7
推荐指数
1
解决办法
5870
查看次数

基本类型的模板专业化

有没有办法只为基本类型制作模板专业化?我试图做以下事情:

template<typename T, typename = typename std::enable_if<!std::is_fundamental<T>::value>::type>
class foo
{
}

template<typename T, typename = typename std::enable_if<std::is_fundamental<T>::value>::type>
class foo
{
}
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误,模板已经定义.

c++ templates metaprogramming generic-programming

7
推荐指数
1
解决办法
428
查看次数

推广折叠使得它变得足够表达以定义任何有限递归?

因此,有一种被称为"折叠的普遍属性"的东西,完全如下:

g [] = i; g (x:xs) = f x (g xs) <=> g = fold f i

但是,正如您现在可能的那样,有一些罕见的情况dropWhile,fold f i 除非您将其概括,否则无法重新定义.

最简单但最明显的推广方法是重新定义通用属性:

g' y [] = j y; g' y (x:xs) = h y x xs (g' y xs) <=> g' y = fold (?) l


在这一点上,我可以做出我的假设:我假设存在某种功能p :: a -> b -> b,这将满足等式g' y = fold p l.让我们尝试用普遍属性帮助解决给定的方程式,一开始就提到:

  • g' y [] = j y = fold p l [] = l …

haskell functional-programming proof generic-programming fold

7
推荐指数
1
解决办法
163
查看次数

特质的泛型类型和通用的相关类型之间有什么区别?

在Rust中提供通用关联类型之前会询问此问题,尽管它们是提出开发的.

我的理解是,特质泛型和相关类型在它们可以绑定到结构的类型数量上有所不同.

泛型可以绑定任意数量的类型:

struct Struct;

trait Generic<G> {
    fn generic(&self, generic: G);
}

impl<G> Generic<G> for Struct {
    fn generic(&self, _: G) {}
}

fn main() {
    Struct.generic(1);
    Struct.generic("a");
}
Run Code Online (Sandbox Code Playgroud)

关联类型只绑定1种类型:

struct Struct;

trait Associated {
    type Associated;

    fn associated(&self, associated: Self::Associated);
}

impl Associated for Struct {
    type Associated = u32;

    fn associated(&self, _: Self::Associated) {}
}

fn main() {
    Struct.associated(1);
    // Struct.associated("a"); // `expected u32, found reference`
}
Run Code Online (Sandbox Code Playgroud)

通用关联类型是这两者的混合.它们绑定到一个类型正好相关的1个生成器,而这个生成器又可以关联任意数量的类型.那么Generic前一个例子与这个通用关联类型有什么区别? …

generics generic-programming rust

7
推荐指数
2
解决办法
457
查看次数