标签: generic-programming

当auto和decltype()不能使用时,如何避免重复封闭类类型

我最近发现了C++ 11的优点autodecltype()特性,它们非常出色,因为它们可以消除大量的冗余类型代码.但是,有些情况下它们无法使用.我主要询问的一个例子是,如果你想要声明一个类型使用封闭类类型的变量,可以是直接的,也可以是模板参数,并且你没有初始化表达式(允许你使用它)auto).如果封闭类类型是具有许多模板参数的模板类,则这尤其不合需要.例如:

template<typename T1, typename T2, typename T3, typename T4, typename T5 > struct S {
    std::map<int,S<T1,T2,T3,T4,T5>*> m1;
    std::map<int,S<T1,T2,T3,T4,T5>*> m2;
    std::map<int,S<T1,T2,T3,T4,T5>*> m3;
    std::map<int,S<T1,T2,T3,T4,T5>*> m4;
    std::map<int,S<T1,T2,T3,T4,T5>*> m5;
};
Run Code Online (Sandbox Code Playgroud)

逻辑解决方案是使用typedef:

template<typename T1, typename T2, typename T3, typename T4, typename T5 > struct S {
    typedef S<T1,T2,T3,T4,T5> ThisClass;
    std::map<int,ThisClass*> m1;
    std::map<int,ThisClass*> m2;
    std::map<int,ThisClass*> m3;
    std::map<int,ThisClass*> m4;
    std::map<int,ThisClass*> m5;
};
Run Code Online (Sandbox Code Playgroud)

但是仍然不希望声明一个只重复封闭类类型的typedef.

如果您在实例方法中,通过推导类型,实际上可以解决这个问题*this,尽管必要的代码比我想要的更详细:

auto copy(void) {
    typename std::remove_reference<decltype(*this)>::type s = *this;
    // ... do stuff with s …
Run Code Online (Sandbox Code Playgroud)

c++ generic-programming

0
推荐指数
1
解决办法
129
查看次数

动态地将字符串转换为相同名称空间中的类名称Type.GetType()返回null

我有一个Liststrings含有UserControl类.我想传递List一个foreach()循环,并创建一个object每个classList

 List<string> MyUserControlList= new List<string>();
            Permissions.Add("Profile_UC");
            Permissions.Add("Bio_UC");

foreach(var Information in MyUserControlList)
            {

                //Getting Usercontrol class name
                Type uc1 = Type.GetType(Information); 

               // Type uc1 = Type.GetType("Tab_Control_and_User_Control_test."+Permission,Assembly.GetEntryAssembly().GetName().Name);

                //Creating instance of relative user control class
                Object MyUserControlObject = Activator.CreateInstance(uc1);                
                //rest of my logic

            }
Run Code Online (Sandbox Code Playgroud)

我搜索并发现它是一种装配问题,但我没有找到任何好的资源来以动态的方式指出它.

c# type-conversion generic-programming

0
推荐指数
1
解决办法
638
查看次数

如何从golang的地图中统一获取钥匙片?

我试过了

func Keys(m map[string]interface{}) []string {
    keys := make([]string, 0, len(m))
    for k := range m {
        keys = append(keys, k)
    }
    return keys
}
Run Code Online (Sandbox Code Playgroud)

不能在键参数中使用m(map [string] int类型)作为map [string] interface {}类型

我知道golang不支持泛型,因此可以统一获取密钥切片吗?

generic-programming go

0
推荐指数
1
解决办法
2715
查看次数

动态解析字段名称的记录更新

我有一个记录定义如下:

data MyData = MyData
    { name :: String
    , addr :: String
     ... a lot of other fields of String type
    }
Run Code Online (Sandbox Code Playgroud)

接下来我想创建对列表(String, fieldName),如下所示:

fields =
  [ ("NAME", name)
  , ("ADDRESS", addr)
  , ... and for other fields
  ]
Run Code Online (Sandbox Code Playgroud)

最后,我需要一个函数,它可以获取类型的空记录MyData并逐个字段动态填充它,如下所示:

initByStrings strs = foldl (\ d (x, y) -> d{y=(findIn x strs)}) emptyMyData fields 
Run Code Online (Sandbox Code Playgroud)

在 Haskell 中,如果没有像下面这样的长单调结构,这样的行为是否可能?

...
lst = map (\ x -> findIn x strs) fields
f lst where
    f (name:addr:...) = MyData …
Run Code Online (Sandbox Code Playgroud)

haskell functional-programming generic-programming

0
推荐指数
1
解决办法
134
查看次数

模板函数如何与可能共享交集的多个类型名一起工作?

我是 C++ 新手,目前正在尝试了解模板函数的工作原理。首先我想添加两个相同类型的数值,这很容易理解。

template <typename T>
T add(T a, T b){return a+b;}
int main(){
    float a_f=2.5;float b_f=1.5;float c_f;
    int a_i=2;int b_i=1;int c_i;
    c_f = add(a_f, b_f);
    c_i = add(a_i, b_i);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

接下来我想添加两个具有不同和相同类型的数字。我天真的假设是这样的:

template<typename R, typename S, typename T>
R add(S a, T b){return a+b;}
int main(){
    float a=3.2; int b=2;
    auto result1 = add(a,b);    // error: no matching function for call to ‘add(float&, int&)’
    auto result2 = add(a,a);    // error: no matching function for call to ‘add(float&, float&)’ …
Run Code Online (Sandbox Code Playgroud)

c++ templates generic-programming

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

遍历模板参数

我有一个接收模板参数的函数。

template<class Container>
void function(const Container& object)
{
     //here i want to iterate through object and print them
}

int main()
{
     function(std::vector<int>{1,3,6,7});
     function(std::vector<std::vector<int>>{{1,2,3},{2,5,7}});
}
Run Code Online (Sandbox Code Playgroud)

是否可以在一个函数中执行此操作?假设容器参数是整数。

c++ templates stl generic-programming

0
推荐指数
1
解决办法
87
查看次数

如何为某些特定的泛型类型做 if-else?

我有MyClass并且我想同时调用mySubMethod(key)mySubMethod2(key)整数,但只调用mySubMethod2(key)非整数。

我试过下面的代码,但不起作用。我也试图改变K == int别的东西,例如K == IntegerK.equals(int)K.equals(Integer)等,但他们都没有工作。我该如何解决?谢谢。

public class MyClass<K,V> {

    public boolean myMethod(K key) {
        if (K == int) {
            mySubMethod(key);
        }else {
            // do nothing
        }
        mySubMethod2(key);
        return false;
    }

    public void mySubMethod(K key) {
        /** something */ 
    }

    public void mySubMethod2(K key) {
        /** something */ 
    }

}
Run Code Online (Sandbox Code Playgroud)

java generics polymorphism casting generic-programming

0
推荐指数
1
解决办法
56
查看次数