SWIG不会包装派生类的继承的静态函数。如何解决?
这是问题的简单说明。
这是一个简单的C ++头文件:
// file test.hpp
#include <iostream>
class B
{
public:
static void stat()
{ std::cerr << "=== calling static function B::stat" << std::endl; }
void nonstat() const
{ std::cerr << "==== calling B::nonstat for some object of B" << std::endl; }
};
class D : public B {};
Run Code Online (Sandbox Code Playgroud)
C ++源文件仅包含头文件:
// file test.cpp
#include "test.hpp"
Run Code Online (Sandbox Code Playgroud)
SWIG接口文件仅包含C ++头文件:
// file test.swig
%module test
%{
#include "test.hpp"
%}
%include "test.hpp"
Run Code Online (Sandbox Code Playgroud)
然后,我以此生成swig包装器代码:
swig -c++ -tcl8 -namespace main.swig
Run Code Online (Sandbox Code Playgroud)
然后我以此创建一个共享库:
g++ -fpic …
Run Code Online (Sandbox Code Playgroud) Bash命令可从交互式tclsh会话中获得.例如,在tclsh会话中,您可以拥有
% ls
Run Code Online (Sandbox Code Playgroud)
代替
$ exec ls
Run Code Online (Sandbox Code Playgroud)
但是,你不能有一个直接调用bash命令的tcl脚本(即没有exec
).
在解释tcl脚本文件时如何让tclsh识别bash命令,就像在交互式会话中一样?
我猜有一些tcl包(或类似的东西),它在启动交互式会话时自动加载,以支持直接调用bash commans.如何在tcl脚本文件中手动加载?
当我试图在MATLAB containers.Map中使用MATLAB句柄对象作为键值时,问题出现了.
ld( h1, h2 )
在句柄对象上定义线性顺序,因此对使用句柄对象作为映射的键值应该没有限制,但是只允许使用整数或字符串类型.
此问题的解决方法可能是检索句柄对象的实际ID(地址)(基本上在ld
功能上进行比较).
所以问题是:如何获取句柄对象的ID?
发现可以使用静态成员函数中的持久变量来完成变通方法.
在这种情况下,您应该从基类继承所有类,如下所示.
classdef object < handle
properties ( GetAccess = 'public', SetAccess = 'private' )
id
end
methods ( Access = 'protected' )
function obj = object()
obj.id = object.increment();
end
end
methods ( Static, Access = 'private' )
function result = increment()
persistent stamp;
if isempty( stamp )
stamp = 0;
end
stamp = stamp + uint32(1);
result = stamp;
end …
Run Code Online (Sandbox Code Playgroud) 基类具有函数f.派生类会覆盖函数f.我想为派生类的对象调用基类'f.我怎样才能做到这一点?
这是代码示例.
classdef base
methods ( Access = public )
function this = f( this )
disp( 'at base::f' );
end
end
end
classdef derived < base
methods ( Access = public )
function this = f( this )
% HERE I WANT TO CALL base::f
this@base.f(); % this is an error
disp( 'at derived::f' );
end
end
end
d = derived();
d.f();
% here the result should be
% at base::f
% at derived::f
Run Code Online (Sandbox Code Playgroud) Tcl expr
函数支持以十六进制表示法编写的参数:以操作数开头的操作数0x
被视为以十六进制形式写入的整数.
但是返回值expr
总是以十进制形式:expr 0xA + 0xA
返回20
,没有0x14
.
有没有办法告诉expr
返回十六进制表示?是否有一个Tcl函数将十进制表示转换为十六进制?
考虑这段代码:
\n\nconstexpr int TEN = 10;\n\ntemplate < const int& >\nstruct Object { };\n\ntemplate < const int& II >\nvoid test(Object<II>) { }\n
Run Code Online (Sandbox Code Playgroud)\n\n然后调用:
\n\ntest<TEN>(Object<TEN>{}); // passes\ntest(Object<TEN>{}); // FAILS\n
Run Code Online (Sandbox Code Playgroud)\n\n第二次调用无法编译并显示错误消息:
\n\nerror: no matching function for call to \xe2\x80\x98test(Object<TEN>)\nnote: candidate: template<const int& II> void test(Object<II>)\nnote: template argument deduction/substitution failed:\nnote: couldn\'t deduce template parameter \xe2\x80\x98II\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n\n问题是为什么?是否符合标准?
\n\n更重要的问题是:我该如何解决这个问题?即:如何帮助编译器推导const int&
模板参数?
而在真正的代码中int
我却更复杂literal type
,所以我确实需要const&
. 因此我不能只是“使用int
而不是const int&
”。
我正在使用(快照),并且选项, …
考虑这个代码。
struct Test : public std::optional<int> { };
Test o1, o2;
o1 == o2;
Run Code Online (Sandbox Code Playgroud)
对于最后一行gcc-7.0.1
抱怨error: ambiguous overload
指向两个重载来比较一个可选项和一个值。但它不应该只是选择带有两个选项的重载并成功编译代码吗?
编辑 值比较的重载不应该有“守卫”禁止它们为从 std::optional 继承的类型实例化吗?
我想std::vector
用一些元素构造一个元素,这些元素由一些特定的构造函数而不是默认的构造函数构造.换句话说,我想在构造向量时对元素进行处理.我怎样才能做到这一点?
考虑一下:
struct Item
{
Item(double) {}
Item(const Item&) = delete;
Item(Item&&) = delete;
};
std::vector<Item> vv(10, 3.14); // Fails! Tries to copy while I want to emplace.
Run Code Online (Sandbox Code Playgroud) 请考虑使用gcc-7.0.0最新快照的此代码:
auto lambda1 = [](auto&& id) -> decltype(id == 10) { return id == 10; };
auto lambda2 = [](auto&& id) -> decltype(auto) { return id == 10; };
static_assert(!std::experimental::is_detected_v<ResultOfT,decltype(lambda1),std::string>);
//static_assert(!std::experimental::is_detected_v<ResultOfT,decltype(lambda2),std::string>);
// This doesn't even compile!?
auto bb = std::experimental::is_detected_v<ResultOfT,decltype(lambda2),std::string>;
Run Code Online (Sandbox Code Playgroud)
哪里ResultOfT
只是一个包装std::result_of
.
在这个意义上,为什么lambda1
和lambda2
不等同?
按我的理解decltype(auto)
,在lambda2
应刚的缩写形式decltype(id == 10)
,但实际上它不是,那么是什么原因?
这是GCC中的错误吗?
无法std::optional<T>
被平凡缺省构造?
似乎唯一的障碍是engaged
标志的初始化,但零初始化不处理这种情况吗?
我有一个.sql文件大小约2 GB.我想在笔记本电脑上本地打开数据库.
为此,我想我必须在笔记本电脑上安装SQL服务器和SQL客户端应用程序.
您能否请我找到有关如何获得所有这些内容的相应安装包和文档(我会欢迎任何有关Windows或Linux的答案)?
我确定答案不是,但是,我仍然可以用MS Access打开.sql文件吗?
以下是.sql文件的前几行
--
-- PostgreSQL database dump
--
SET statement_timeout = 0;
SET client_encoding = 'SQL_ASCII';
SET standard_conforming_strings = off;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET escape_string_warning = off;
SET search_path = public, pg_catalog;
SET default_tablespace = '';
SET default_with_oids = false;
Run Code Online (Sandbox Code Playgroud) c++ ×5
c++17 ×3
tcl ×3
c++11 ×2
gcc ×2
inheritance ×2
matlab ×2
oop ×2
optional ×2
bash ×1
constructor ×1
decltype ×1
emplace ×1
exec ×1
expression ×1
handle ×1
hex ×1
interactive ×1
ms-access ×1
non-type ×1
object ×1
parameters ×1
postgresql ×1
swig ×1
templates ×1
vector ×1