我最近发现了C++ 11的优点auto和decltype()特性,它们非常出色,因为它们可以消除大量的冗余类型代码.但是,有些情况下它们无法使用.我主要询问的一个例子是,如果你想要声明一个类型使用封闭类类型的变量,可以是直接的,也可以是模板参数,并且你没有初始化表达式(允许你使用它)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) 我有一个List的strings含有UserControl类.我想传递List一个foreach()循环,并创建一个object每个class在List
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)
我搜索并发现它是一种装配问题,但我没有找到任何好的资源来以动态的方式指出它.
我试过了
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不支持泛型,因此可以统一获取密钥切片吗?
我有一个记录定义如下:
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) 我是 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) 我有一个接收模板参数的函数。
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)
是否可以在一个函数中执行此操作?假设容器参数是整数。
我有MyClass并且我想同时调用mySubMethod(key)和mySubMethod2(key)整数,但只调用mySubMethod2(key)非整数。
我试过下面的代码,但不起作用。我也试图改变K == int别的东西,例如K == Integer,K.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)