我试图根据要返回的值在 Fortran 中创建一个通用函数,即取决于函数的输出是分配给单精度实数还是双精度实数。代码是:
\n\nMODULE 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) 我得到"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),我创建了第二个类,对类类型很有用,所以我可以释放对象.
第三个类是我使用我的包装器,但编译器抛出该错误.我如何编译?
我想编写一条指令,在每次执行指令时将两个值切换为变量; 这是一般情况:有两个值x1, x2并i初始化为x1或x2,在每个指令执行之间x1和之间切换i值x2,即i= x1, x2, x1 ...;,如果我被初始化为x2,i = x2, x1, x2, ...;
例如,在0和1之间切换: i= 3 % (i+2);
如何编写通用x1, x2案例指令?
我是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容器的内部.我怎么能从这一点开始呢?
我正在阅读一些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) 我发现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) 我必须包含几个可以具有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) Perl允许您使用名为的函数捕获对未定义方法的调用AUTOLOAD.每当你调用一个Perl找不到的AUTOLOAD方法时,它会查找一个方法并调用它.这可以以许多不同的方式使用.有关更多信息,请参阅:AUTOLOAD
最近我进入了C++,很奇怪是否有办法在C++程序中模拟这种功能.我知道C++中的所有东西都需要在编译时定义很多,这使得这个问题变得棘手,但我想必须有一些技术涉及模板或其他一些技巧,至少可以接近.
你能AUTOLOAD在C++中获得最接近Perl的功能是什么?
我的目标是编写带有一些多态值的函数,并列出表示具体类型的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完成,但它太难看了.
我想实现一个通用的单件工厂模式,我将所需对象的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)
}