有很多像这样的问题,但它们似乎都没有具体回答我的问题.
你如何实例化一个新的T?
我有一个泛型方法,我需要在type参数中返回一个新类型的实例.这是我的代码......
class MyClass {
public static MyClass fromInputStream( InputStream input ) throws IOException {
// do some stuff, and return a new MyClass.
}
}
Run Code Online (Sandbox Code Playgroud)
然后在一个单独的类我有一个像这样的通用方法...
class SomeOtherClass {
public <T extends MyClass>download(URL url) throws IOException {
URLConnection conn = url.openConnection();
return T.fromInputStream( conn.getInputStream() );
}
}
Run Code Online (Sandbox Code Playgroud)
我也试过以下......
class SomeOtherClass {
public <T extends MyClass>download(URL url) throws IOException {
URLConnection conn = url.openConnection();
return new T( conn.getInputStream() ); // Note my MyClass constructor takes an InputStream...
}
} …Run Code Online (Sandbox Code Playgroud) 我已经看到有一种非常方便的方法来反转ArrayList 像这里使用Collections.reverse()方法,但我需要为几种类型的原始对象(至少ArrayList和List我的自定义对象)实现这样的反向操作.因此Collections无法通过单一方法的延长使用来挽救我的生命.
到目前为止,我设法让stg工作(参见下面的代码),但我必须写两次:一次用于ArrayList,一次用于List.我把它们命名为相同,所以使用非常方便,但有些..优化会更方便:-).
如何将这两种方法共同化为单一(真实)通用方法?
谢谢
/**
* Generic Reverse Method for ARRAYLIST using Iterator
* @param ArrayList<Obj_item> notReversed
* @return ArrayList<Obj_item> reversed
*/
@SuppressWarnings("unchecked")
public static <Obj_item> ArrayList<Obj_item> GenReverseArrayByIterator(ArrayList<Obj_item> mylist) {
// ^^^^^^^^^^^^^^^^^^ how to make this generic ?
// Instanciate
ArrayList<Obj_item> tmp = new ArrayList<Obj_item>();
ArrayList<Obj_item> reversed = new ArrayList<Obj_item>();
// Copy original list
tmp = mylist;
// Generate an iterator, starting right after the last element.
@SuppressWarnings("rawtypes")
ListIterator …Run Code Online (Sandbox Code Playgroud) 我到处寻找(Modern C++ design&co),但我找不到一种很好的方法来存储一组接受不同参数并在不同类上运行的回调.我需要这个,因为我希望我的应用程序的每个对象都有可能将其中一个方法的执行推迟到一个主Clock对象,跟踪当前时间,可以在正确的时刻调用这些方法.我的目标代码是:
在void executeAction1Deferred(int time, int arg1, bool arg2)方法中class1,时间是将来需要的执行时间,应该是这样的:
Clock::defer(time, Class1::action1, this, arg1, arg2);
Run Code Online (Sandbox Code Playgroud)
在Clock::defer(??? what signature ????)表示此任务的对象中,存储在优先级队列中,其中时间是密钥.对于每个Clock量程,然后遍历任务列表,并且将执行需要在该量程中运行的任务.请注意,我使用"defer"作为静态函数,因为我打算Clock使用单例的对象,但它也可以是成员函数,它只是选择的问题.
我曾经想过void*用来保存一个可变数量的参数,但让我的action1()方法接受一个void*非常可怕,也因为每次我直接使用这个函数时我都需要为参数创建一个结构而不推迟它.
我过去曾经多次面对这个问题,而且我从未找到过一个非常好的解决方案.请注意,作为一个小型的多平台项目,为缺乏经验的程序员构建简单性可以扩展它是必不可少的,我不想使用boost.但是,我们解决的平台的每个编译器都std::tr1绑定了.问题是:如何定义泛型函数的容器,每个容器接受可变数量的参数(最多N~5),并且是不是从公共虚拟类派生的对象的不同成员方法?谢谢
我不确定如何陈述我的问题,但我们走了...
所以,我有这个类operator[]有一个空体(尚未实现).但是,当我从中调用它时main(),它会产生一个输出.更重要的是,输出正是前一行中分配给它的输出.
EDIT:我添加了一个名为的私有属性emptyValue,并将其初始化为TipVrijednosti()类构造函数.
这是一个例子:
template<typename TipKljuca, typename TipVrijednosti>
class BinStabloMapa : public Mapa<TipKljuca, TipVrijednosti>
{
.
.
TipVrijednosti &operator[] (const TipKljuca &kljuc) {
return emptyValue;
}
const TipVrijednosti &operator[] (const TipKljuca &kljuc) const {
return emptyValue;
}
.
.
}
int main()
{
BinStabloMapa<int, int> m;
m[100] = 200;
cout << m[100] << endl;
return 0;
}
OUTPUT: 200
Run Code Online (Sandbox Code Playgroud)
谁能告诉我为什么会这样?
是否存在在.NET泛型中对类型参数使用子类型约束的实际示例?通过«subtyping constraints»我的意思是
where T : <base class name>
Run Code Online (Sandbox Code Playgroud)
和
where T : U
Run Code Online (Sandbox Code Playgroud)
可能有一些具有相应约束的标准泛型?或专门的通用.NET库.
UPD有很多关于接口约束的好例子
where T : <interface name>
Run Code Online (Sandbox Code Playgroud)
但是,子类型约束似乎非常具体,并没有那么有用.我试着理解,在这种情况下,这种约束是至关重要的.Luaan的回答包含where T : <base class name>来自ASP.NET MVC的示例,但我仍然对具有where T : U约束的实际示例感兴趣.
我正在练习一些C问题遇到一个递归函数用表达式作为参数调用自身的场景.
Pow(double x, unsigned n){
.....
.....
return Pow(x*x,n/2);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,是否计算表达式(X*X,如在由值调用)时,参数被传递或执行此一惰性求即,不评价使用时为止.
以下是详细问题
查找调用Pow(5.0,12)的乘法次数?
Pow(double x, unsigned n) {
if(n==0) return 1;
if(n==1) return x;
if(n%2==0) return Pow(x*x,n/2);
else
return Pow(x*x,n/2)*x;
}
Run Code Online (Sandbox Code Playgroud)
选项5,6,8,12
c recursion parameter-passing generic-programming call-by-value
我正在寻找关于如何为自定义数据类型实现专门的"最大"(即最大)函数的建议,该类型也适用于标量类型float.我正在编写的数据类型是向量的包装器(最终是四个浮点数的SIMD向量,而不是a std::vector),我想提供一个max函数来比较两个向量并返回一个新的向量,它是每个元素的最大值.这与std::max使用比较运算符的不同,但概念是相同的.
问题是我有一个do_max(T x, T y)适用max于输入的泛型函数.我需要这个函数来处理标量浮点输入(例如do_max<float>(0.1f, 0.2f))和我的矢量类(例如do_max<MyVector>(v0, v1)).
需要注意的是超载MyVector的比较操作是不是一种选择,因为我使用的是那些与SIMD内部函数是有很大的不同:他们创建一个包含整数向量1,0,-1每个元素的比较,而不是返回一个布尔结果.
除非你注释掉这float f0 = ...行,否则下面的代码不会编译:
// compile with: g++ -std=c++11 max.cc -o max
#include <algorithm>
#include <vector>
class MyVector {
public:
MyVector(float x0, float x1, float x2, float x3) : storage_ { x0, x1, x2, x3 } {};
friend MyVector max(MyVector lhs, const MyVector & rhs);
private:
std::vector<float> storage_;
};
MyVector max(MyVector lhs, …Run Code Online (Sandbox Code Playgroud) C++语言允许我编写一个模板函数,该函数将调用传递给函数的对象上的方法.
这里的问题是当我这样做时,我的IDE(NetBeans 8.2)会抱怨它无法解决该方法.这是有道理的,因为在我尝试编译代码之前,用于"T"的类型是未知的,但它给我一个警告的事实使我有点担心这样做是不是错误的编程实践.
请考虑以下代码:
struct S1 {
void method() const {
cout << "Method called from S1!" << endl;
}
};
struct S2 {
void method() const {
cout << "Method called from S2!" << endl;
}
};
template <typename T>
void call_method(const T& object) {
// IDE reports a warning "can't resolve the template based identifier method."
object.method();
}
Run Code Online (Sandbox Code Playgroud)
用法示例:
S1 obj1;
S2 obj2;
call_method(obj1);
call_method(obj2);
Run Code Online (Sandbox Code Playgroud)
这段代码将编译并正常工作,但IDE总是会抱怨.这可以吗?或者是否有一个更好的设计,我应该知道,以获得相同的预期结果.
期望的结果是编写一个可以使用S1或S2对象的函数,而无需关心它是哪一个,只要它们提供包含"method()"的接口即可.
假设我无法访问S1和S2的源代码,因此无法对其进行更改.(例如,我不能使它们从公共基类继承并使用动态多态而不是模板函数来实现相同的效果).
我目前尝试在C中写一些lil文字控制台游戏.
为此,我需要能够在...中打印出类似窗口的结构... C.
我想使用通用渲染方法(让我们调用它frame_render(...))来渲染所有不同的"ui元素"
现在的问题是:如何解决这个问题?
给定方案:
// Theoretical base
struct frame { int x; int y; int width; int height; }
struct button { int x; int y; int width; int height; ... }
struct whatever { int x; int y; int width; int height; ... }
Run Code Online (Sandbox Code Playgroud)
我怎么能保证我的x,y,width并height总是在正确的位置的内存明智?是否足以在刚开始时"正好"将它们放在同一个顺序中?
另外,如何设计方法标题来接受它?
我在这里以及模板编程方面都是新手。我有一本字典(意味着它可以是std::mapor std::vector<std::pair<type1, type2>>或std::set<std::pair<, >>...。)我想写一个算法,该算法的作用类似于使用所传递容器的迭代器的标准库算法。
以下是想法。
#include <iostream>
#include <algorithm>
#include <type_traits>
#include <vector>
#include <array>
#include <map>
#include <set>
#include <iterator>
// two different types
enum EnumA { one, two, three, four, five, six};
enum EnumB { one, three, four, six};
// TypeA TypeB
using map = std::map<EnumA, EnumB>;
// or std::vector<std::pair<EnumA, EnumB>>
// or std::set<std::pair<EnumA, EnumB>>
// or std::array<std::pair<EnumA, EnumB>, 3>
const map itemMap{ // the map
{EnumA::one, EnumB::one},
{EnumA::three, EnumB::three},
{EnumA::six, EnumB::six},
}; …Run Code Online (Sandbox Code Playgroud)