标签: generic-programming

C#中的通用方法

一般来说,通用方法对我来说都是新的.需要一个返回泛型类型的Collection的方法,但也需要一个相同泛型类型的集合

Expression<Func<GenericType, DateTime?>>[] Dates 
Run Code Online (Sandbox Code Playgroud)

参数.整个以下函数的T应该是相同的类型,所以现在我正在使用(简化版):

private static Collection<T> SortCollection<T>(Collection<T> SortList, Expression<Func<T, DateTime>>[] OrderByDateTime)
{
    return SortList.OrderBy(OrderByDateTime[0]);
}
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

错误:无法从用法推断出方法'System.Linq.Enumerable.OrderBy(System.Collections.Generic.IEnumberable,System.Func)'的类型参数.尝试显式指定类型参数.

反正有没有这样做?

c# generics collections methods generic-programming

2
推荐指数
1
解决办法
4117
查看次数

适当的模板使用

假设我有一个名为Object的类.Object类有一个成员函数,它想要从容器中读取字符串.假设函数看起来像这样:

template <class InputIterator>
void Object::add(InputIterator first, InputIterator last) { ... }
Run Code Online (Sandbox Code Playgroud)

虽然这允许调用者从任意容器传递字符串,但它并不表示迭代器必须是一对字符串迭代器的事实.

在这种情况下使用模板是否仍然合适,还是应该强制调用者使用预定的字符串容器?

c++ templates iterator coding-style generic-programming

2
推荐指数
1
解决办法
146
查看次数

如何使用begin()自由函数

我目前正在编写一个处理通用容器的函数模板.我想用std::begin()std::end(),因上述原因在这一问题.我的问题是,我是否应该使用:

std::begin( myContainer )
Run Code Online (Sandbox Code Playgroud)

要么:

using namespace std; // Better use: "using std::begin"
begin( myContainer )
Run Code Online (Sandbox Code Playgroud)

或者,换句话说,是否可以begin()std命名空间内重载?我是否应该允许我的函数用户其他地方重载全局命名空间中begin()函数?STL如何处理它?

c++ templates stl generic-programming c++11

2
推荐指数
1
解决办法
968
查看次数

适用于所有数值数据类型的函数

我写了一个简单的函数来反转给定的数字:

let reverseNumber x =
    let rec innerFunc acc elem =
        if elem = 0
            then acc
            else 
                let rem = elem % 10
                innerFunc (10 * acc + rem) (elem / 10)

    innerFunc 0 x
Run Code Online (Sandbox Code Playgroud)

问题是它只适用于整数.对于例如,Int64的,我需要创建一个使用另一个版本0L,并10L取代010分别.

我听说可以使用内联关键字和LanguagePrimitives编写更多泛型函数,但后者既不包含提醒操作也不包含'GenericTen'(尽管可能通过'GenericOne + GenericOne + ...获得).

你能帮忙吗 ?

f# inline generic-programming

2
推荐指数
1
解决办法
92
查看次数

数据类型 - 通用编程和神秘的gdmXXX

我正在使用数据类型泛型编程来调用Generic包含调用方法的类get.如果我的最终用户定义了类型并忘记添加deriving Generic和调用put,他们将看到如下错误消息:

No instance for (ALife.Creatur.Genetics.Code.BRGCWord8.GGene
(GHC.Generics.Rep ClassifierGene))
arising from a use of `ALife.Creatur.Genetics.Code.BRGCWord8.$gdmput'
Run Code Online (Sandbox Code Playgroud)

我可以告诉用户如何修复错误,但我很好奇$gdmput.我认为它是一个自动生成的函数或符号,但是通过什么?它是使用DefaultSignaturespragma还是DeriveGenericpragma?我读了一些关于数据类型 - 泛型编程的论文,但没有看到任何对gdmXXX符号的引用.

这是Generic班级的定义.

{-# LANGUAGE TypeFamilies, FlexibleContexts, FlexibleInstances,
    DefaultSignatures, DeriveGeneric, TypeOperators #-}
. . .

-- | A class representing anything which is represented in, and
--   determined by, an agent's genome.
--   This might include traits, parameters, "organs" (components of
--   agents), or even entire agents. …
Run Code Online (Sandbox Code Playgroud)

haskell generic-programming

2
推荐指数
1
解决办法
185
查看次数

Multimap上的C++泛型编程

multimap如下所示:

int main() {
    multimap<int, string> coll;
    coll = { {5, "tagged"} ,
             {2, "a"} ,
             {1, "this"} ,
             {4, "of"} ,
             {6, "strings"} ,
             {1, "is"} ,
             {3, "multimap"} 
          };
}
Run Code Online (Sandbox Code Playgroud)

现在,我想得到一个像下面这样的函数模板,逐个打印这些容器中的所有值元素,包括multimap但不限于这种类型的映射和这对特定的模板参数.

void PrintAllMaps(multimap<int, string> map) {
    for (auto elem : map) {
        cout << elem.second << ' ';
    }
    cout << endl;
}
Run Code Online (Sandbox Code Playgroud)

c++ stl generic-programming

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

具有通用等级的数组成员的类

请考虑以下代码示例:

#include <iostream>
#include <tuple>

template<typename T, std::size_t Rank, std::size_t... In>
struct help;

template<typename T, std::size_t... In>
struct help<T, 1, In...> 
{
    static constexpr auto a = std::make_tuple(In...);
    T data[std::get<0>(a)];
};

template<typename T, std::size_t... In>
struct help<T, 2, In...>
{
    static constexpr auto a = std::make_tuple(In...);
    T data[std::get<0>(a)][std::get<1>(a)];
};

template<typename T, std::size_t... In>
class foo : public help<T, sizeof...(In), In...>
{
private:
    using base = help<T, sizeof...(In), In...>;

public:
    template<typename... Tn>
    constexpr foo(Tn&&... args)
        : base{ { args... } } …
Run Code Online (Sandbox Code Playgroud)

c++ templates generic-programming c++11

2
推荐指数
1
解决办法
153
查看次数

Rust中意外的类型推断失败

举个例子来看看:

type Mat4x4<T> = [T; 16];

fn main() {
    let m: Mat4x4 = [0.4323f32; 16];
    println!("{:?}", m);
}
Run Code Online (Sandbox Code Playgroud)

编译器不能推理矩阵类型,工作代码如下:

type Mat4x4<T> = [T; 16];

fn main() {
    let m: Mat4x4<f32> = [0.4323f32; 16];
    println!("{:?}", m);
}
Run Code Online (Sandbox Code Playgroud)

我不知道这可能是预期的行为.

type-inference generic-programming rust

2
推荐指数
1
解决办法
109
查看次数

将具体实现作为通用返回

我有一个看起来像这样的界面:

public interface IFaker
{
    Faker<T> GetFaker<T>() where T : class;
}

public class DogFaker : IFaker
{
    public Faker<T> GetFaker<T>() where T : class
    {
        return new Faker<Dog>()
            .RuleFor(dog => dog.Name, f => f.Name.FirstName(Name.Gender.Male))
            .RuleFor(dog => dog.IsGoodBoy, f => f.Random.Bool());
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是 - 我不能Faker<Dog>代替Faker<T>例如

Bogus.Faker<_scratchpad.models.Dog>' to 'Bogus.Faker<T>

显然我无法改变new Faker<Dog>,new Faker<T>因为那时我无法访问Dog属性.

我想像这样使用对象:

private Dictionary<string, object> _fakers;

public FakerService()
{
    _fakers = InitialiseFakers();
}

private Dictionary<string, object> InitialiseFakers()
{
   return new Dictionary<string, …
Run Code Online (Sandbox Code Playgroud)

c# oop generics generic-programming bogus

2
推荐指数
1
解决办法
69
查看次数

从模板参数声明模板化类中的函数指针

我试图从函数原型的模板参数声明函数指针

template <typename ReturnType, typename... Args> class DllFunction {
public:
  ReturnType (*fptr_)(Args...);
};

DllFunction<int(int)> f;
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

错误:C2091:函数返回功能

c++ templates generic-programming variadic-templates c++17

2
推荐指数
1
解决办法
64
查看次数