标签: generic-programming

基于返回类型的 Fortran 泛型函数

我试图根据要返回的值在 Fortran 中创建一个通用函数,即取决于函数的输出是分配给单精度实数还是双精度实数。代码是:

\n\n
MODULE kk_M\n\n   USE ISO_FORTRAN_ENV\n\n   IMPLICIT NONE\n\n   INTEGER, PARAMETER :: sp = REAL32\n   INTEGER, PARAMETER :: dp = REAL64\n\n   INTERFACE use_func\n      MODULE PROCEDURE use_sp_func\n      MODULE PROCEDURE use_dp_func\n   END INTERFACE use_func\n\n   INTERFACE use_sub\n      MODULE PROCEDURE use_sp_sub\n      MODULE PROCEDURE use_dp_sub\n   END INTERFACE use_sub\n\n   CONTAINS\n\n   FUNCTION use_sp_func() RESULT(res)\n      REAL(KIND=sp) :: res\n      res = 5._sp\n   END FUNCTION use_sp_func\n\n   FUNCTION use_dp_func() RESULT(res)\n      REAL(KIND=dp) :: res\n      res = 5._dp\n   END FUNCTION use_dp_func\n\n   SUBROUTINE use_sp_sub(res)\n      REAL(KIND=sp), INTENT(OUT) :: res\n      res = 5._sp\n   END SUBROUTINE …
Run Code Online (Sandbox Code Playgroud)

fortran function generic-programming

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

我的OO泛型设计出错.我该如何解决它?

我得到"E2511类型参数'T'必须是第三类的类类型" .

type TSomeClass=class
end;

ParentParentClass<T>=class 
end;

ParentClass<T: class> = class(ParentParentClass<T>)
end;

ChildClass<T: TSomeClass> = class(ParentClass<T>)
end;
Run Code Online (Sandbox Code Playgroud)

我正在尝试为任何数据类型(ParentParentClass)编写一个简单的通用数组包装器,但因为我无法释放类型idenitifiers(如果T是TObject然后是Tobject(T).Free),我创建了第二个类,对类类型很有用,所以我可以释放对象.

第三个类是我使用我的包装器,但编译器抛出该错误.我如何编译?

delphi generics delphi-2009 generic-programming

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

每次执行指令时,如何编写单个指令将两个值切换为变量?

我想编写一条指令,在每次执行指令时将两个值切换为变量; 这是一般情况:有两个值x1, x2i初始化为x1x2,在每个指令执行之间x1和之间切换i值x2,即i= x1, x2, x1 ...;,如果我被初始化为x2,i = x2, x1, x2, ...;

例如,在0和1之间切换: i= 3 % (i+2);

如何编写通用x1, x2案例指令?

c functional-programming generic-programming

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

是否可以概括一个将STL容器作为参数的函数?

我是C++中泛型函数的新手.我有一个模板功能,可以打印矢量的内部.

template<class T>
void print(vector<T> v){
    for(typename vector<T>::iterator it=v.begin(); it != v.end() ; it++)
        cout << *it << endl;
}
Run Code Online (Sandbox Code Playgroud)

我想写一个更通用print()的打印STL容器的内部.我怎么能从这一点开始呢?

c++ templates stl generic-programming

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

Fortran接口,程序和功能关系

我正在阅读一些Fortran 90代码并遇到一些我不熟悉的概念.部分代码,用于计算两个向量的点积,dmf_dotp用于实数值,zmf_dotp用于复数值.

mesh.F90:

#include mesh_inc.F90

interface dmf_dotp
  module procedure dmf_dotp_1, dmf_dotp_2
end interface dmf_dotp

interface zmf_dotp
  module procedure zmf_dotp_1, zmf_dotp_2
end interface zmf_dotp
Run Code Online (Sandbox Code Playgroud)

在另一个文件中有以下功能:

R_TYPE function X(mf_dotp_1)(mesh, f1, f2, reduce, dotu) result(dotp)
R_TYPE function X(mf_dotp_2)(mesh, dim, f1, f2, reduce, dotu) result(dotp)
Run Code Online (Sandbox Code Playgroud)

然后可以用zmf_dotp或调用这些函数(或接口?)dmf_dotp.那么这里到底发生了什么?


编辑感谢弗拉基米尔˚F.事实证明,还有一些预处理器宏定义:

#define X(x)        z ## x
#define R_TYPE      CMPLX
Run Code Online (Sandbox Code Playgroud)

fortran generic-programming fortran90

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

为什么list :: unique只删除C++中的连续元素?

我发现list::unique()只删除列表中的连续元素.我想知道该方法的功能是这样的.

从列表中删除重复项说明如何从列表中删除重复元素,但它不解释为什么只删除连续元素.

以下是我的测试代码:

#include <algorithm>
#include <iostream>
#include <list>
#include <string>
#include <utility>

using namespace std;

void print_message( const pair<int,string>& message )
{
    cout << message.first << " - " << message.second << endl;
}

int main( )
{
list< pair< int, string > > message;
list< pair< int, string > >::iterator ip;

message.push_back( make_pair( 1, string("Test Foo One")) );
message.push_back( make_pair( 1, string("Test Foo Two")) );
message.push_back( make_pair( 1, string("Test Foo Two")) );
message.push_back( …
Run Code Online (Sandbox Code Playgroud)

c++ generic-programming

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

是否可以使用NULL检查制作通用C++函数指针包装器?

我必须包含几个可以具有NULL值的函数指针.我正在尝试为此创建一个通用类模板,它检查函数指针是否为NULL,如果指针不为NULL则调用原始函数,如果指针为NULL则返回默认值.像这样的东西:

//Function typedefs
typedef void(*foo)();
typedef int(*bar)(int u, char *);

//Function pointers
foo gfFoo;
bar gfBar;

//Wrapper class
template<typename T,  typename... Args>
class WrapFuncObj {
    T* f;
public:
    WrapFuncObj(T* t) {
        f = t;
    }
    typename std::result_of<T(Args...)>::type operator()(Args&&... args) {
        if(f != nullptr){
            return (*f)(std::forward<Args>(args)...);
        }
        else
        {
            return 0; //RETURN something for non-void types
        }
    }
};

template<typename T,  typename... Args>
class WrapFuncObjVoid {
    T* f;
public:
    WrapFuncObjVoid(T* t) {
        f = t;
    }
    typename std::result_of<T(Args...)>::type operator()(Args&&... args) { …
Run Code Online (Sandbox Code Playgroud)

c++ templates function wrapper generic-programming

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

功能类似于Perl在C++中的AUTOLOAD

Perl允许您使用名为的函数捕获对未定义方法的调用AUTOLOAD.每当你调用一个Perl找不到的AUTOLOAD方法时,它会查找一个方法并调用它.这可以以许多不同的方式使用.有关更多信息,请参阅:AUTOLOAD

最近我进入了C++,很奇怪是否有办法在C++程序中模拟这种功能.我知道C++中的所有东西都需要在编译时定义很多,这使得这个问题变得棘手,但我想必须有一些技术涉及模板或其他一些技巧,至少可以接近.

你能AUTOLOAD在C++中获得最接近Perl的功能是什么?

c++ generic-programming autoload

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

如何通过'TypeRep'指定值的类型?

我的目标是编写带有一些多态值的函数,并列出表示具体类型的typereps.它返回具有相同值的新列表,但已经转换为通过typereps指定的具体类型.

让我们有值的这种列表:["one", "two"]-XOverloadedStrings启用.
每个的类型分别是IsString a => a.

我们可以通过这种方式获得的类型的列表:

import Data.Typeable (Proxy(..), typeRep)
import Data.Text     (Text)

[typeRep (Proxy :: Proxy String), typeRep (Proxy :: Proxy ByteString)]
Run Code Online (Sandbox Code Playgroud)

有没有办法获得"one"类型String"two"类型ByteString

PS为了防止根据包含不同类型值的列表的错误,我们可以包装每个值Dynamic.,如下例所示(伪代码):

 {-# LANGUAGE ParallelListComp #-}

 import Data.Dynamic (toDyn)

 [ toDyn (val :: type') | val <- vals | type' <- concreteTypes ]
Run Code Online (Sandbox Code Playgroud)

它可以使用Template Haskell完成,但它太难看了.

polymorphism haskell types dynamic generic-programming

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

Singleton Factory - 使用Java 8实现

我想实现一个通用的单件工厂模式,我将所需对象的Class作为参数传递,如果已经为它创建了一个对象,工厂类应检查映射,如果它已经从map返回该对象.如果没有,请创建一个新实例,将其放在地图中并返回实例.

我可以将泛型返回类型作为Object,但我不想在我调用get实例方法的每个地方强制转换返回的对象.

下面是代码:我在c.cast(实例)行收到编译错误;

我们不使用spring/dependency注入,而是尝试实现公共类来处理创建所有单例对象.

提前致谢.

public class SingletonFactory {
    public static Map<String,Object> objectFactory = new HashMap<String, Object>();

    public static <T extends Object> T getInstance(Class<?> c){
    String key = c.toString();
    Object instance= objectFactory.get(key);
    if(instance == null){
        synchronized (c) {
            try{
                instance = c.newInstance();
                objectFactory.put(key, instance);
            }catch(IllegalAccessException | InstantiationException e){
                throw new RuntimeException("Exception while creating singleton instance for class : "+key+" - Exception Message : "+e);
            }
        }
    }
    return c.cast(instance);
}
Run Code Online (Sandbox Code Playgroud)

}

java singleton generic-programming

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