小编Cra*_*ght的帖子

if/while(condition){:参数的长度为零时出错

我收到了错误

Error in if (condition) { : argument is of length zero
Run Code Online (Sandbox Code Playgroud)

要么

Error in while (condition) { : argument is of length zero
Run Code Online (Sandbox Code Playgroud)

是什么导致此错误消息,这是什么意思?

在进一步检查时,似乎价值是NULL.

condition
## NULL
Run Code Online (Sandbox Code Playgroud)

为了处理这个错误,我该如何测试NULL值?

我希望这会返回TRUE,但我得到一个空的逻辑值:

condition == NULL
## logical(0)
Run Code Online (Sandbox Code Playgroud)

r r-faq

32
推荐指数
3
解决办法
7万
查看次数

什么是使用SWIG包装对象从C++调用Python函数的最简洁方法

我有以下代码,它实现了一个带有Python回调函数的简单C++类(ObjWithPyCallback).我们的想法是用"this"作为单个参数调用Python函数.

问题是,由于ObjWithPyCallback是一个SWIG包装对象,我需要SWIG typeinfo才能创建一个Python对象.

这个问题是它在SWIG生成的文件"ObjWithPyCallback_wrap.cxx"中.SWIG可以生成头文件吗?到目前为止,我还未能实现这一目标.

但是,即使使用头文件,SWIG和我的主要实现之间也存在循环依赖关系,这很烦人.如果可能的话,我想找到一种方法来避免它.最终ObjWithPyCallback最终存在于与Python绑定不同的共享库中.

是否有一个干净的方法来解决这个问题?我知道这篇文章,但它只涉及SWIG_NewPointerObj的机制.

在此先感谢您的帮助!

这是代码:

文件:example.py

import cb

def foo(x=None):
    print("Hello from Foo!")
    # I'd like x to be a reference to a ObjWithPyCallback object.
    print(x)

o = cb.ObjWithPyCallback()
o.setCallback(foo)
o.call()
Run Code Online (Sandbox Code Playgroud)

文件:ObjWithPyCallback.h

#include <Python.h>

class ObjWithPyCallback 
{
   public:

      ObjWithPyCallback();
      void setCallback(PyObject *callback);
      void call();

      PyObject *callback_;
};
Run Code Online (Sandbox Code Playgroud)

文件:ObjWithCallback.cpp

#include "ObjWithPyCallback.h"

#include <iostream>

ObjWithPyCallback::ObjWithPyCallback() : callback_(NULL) {}

void ObjWithPyCallback::setCallback(PyObject* callback)
{
   if (!PyCallable_Check(callback))
   {
      std::cerr << "Object is not callable.\n";
   }
   else
   {
      if ( callback_ …
Run Code Online (Sandbox Code Playgroud)

c++ python swig

12
推荐指数
2
解决办法
6374
查看次数

基于策略的Variadic模板设计

我有一组同类策略类,我想将它们作为策略传递给模板类PolicyDrivenClass,它采用一些未知数量的策略模板参数.

每个策略都实现了一个"名称"功能,我希望能够通过PolicyDriveClass :: getNames在运行时查询所有策略的名称.

我有一个工作实现,但它感觉笨重,特别是考虑到在我的最终设计中,Policy类将实现类似于"name"的几个函数,尽管可能具有不同的返回类型,并且我的Policy Driven Class将希望提供类似的访问器每个功能的"getNames".

我的问题是,是否有人能够为此提出更好的实施方案.

为什么它值得我使用clang ++.我的g ++版本不喜欢这个.

这是我到目前为止所拥有的:

#include <string>
#include <deque>
#include <algorithm>
#include <iterator>
#include <iostream>
using namespace std;

template<typename... Policies>
class PolicyDrivenClass
{
   public:

      template<typename T, typename... Types>
      class NameExtractor
      {
         public:
            static deque<string> getNames() 
            {
               deque<string> names = NameExtractor<Types...>::getNames();
               names.push_front(T::name());
               return names;
            }

      };
      template<typename T>
      class NameExtractor<T>
      {
         public:
            static deque<string> getNames() 
            {
               deque<string> ret;
               ret.push_back(T::name());
               return ret;
            }
      };

      deque<string> getNames() const
      {
         return NameExtractor<Policies...>().getNames();
      }
};

class Policy1
{ …
Run Code Online (Sandbox Code Playgroud)

c++ templates policy-based-design variadic-templates c++11

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

Visual Studio是否具有类似Emacs寄存器的功能?

寄存器是我大量使用的emacs的一个功能.对于那些不熟悉的人,你会突出显示一些文字,然后让emacs将它放在一个带编号的寄存器(0-9)中.然后,当您继续前进时,您可以要求emacs将给定寄存器中的文本插入到您的代码中.

基本上我可以动态保存一大块文本,然后在以后将其插入缓冲区.当会话终止时,寄存器的内容将消失.

问题是,Visual Studio有类似的功能吗?

emacs editor visual-studio

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

尽管令牌不完整,但提升精神意味着成功解析

我有一个非常简单的路径构造,我试图用boost spirit.lex解析.

我们有以下语法:

token := [a-z]+
path := (token : path) | (token)
Run Code Online (Sandbox Code Playgroud)

所以我们这里只讨论冒号分隔的小写ASCII字符串.

我有三个例子"xyz","abc:xyz","abc:xyz:".

前两个应被视为有效.第三个,有一个尾随结肠,不应被视为有效.不幸的是,解析器我已经认识到这三个都是有效的.语法不应该允许空令牌,但显然精神就是这样做的.为了让第三个被拒绝,我错过了什么?

此外,如果您阅读下面的代码,则在注释中还有另一个版本的解析器要求所有路径以分号结尾.当我激活那些线时,我可以得到适当的行为(即拒绝"abc:xyz:;"),但这不是我想要的.

有人有主意吗?

谢谢.

#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/lex_lexertl.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>

#include <iostream>
#include <string>

using namespace boost::spirit;
using boost::phoenix::val;

template<typename Lexer>
struct PathTokens : boost::spirit::lex::lexer<Lexer>
{
      PathTokens()
      {
         identifier = "[a-z]+";
         separator = ":";

         this->self.add
            (identifier)
            (separator)
            (';')
            ;
      }
      boost::spirit::lex::token_def<std::string> identifier, separator;
};


template <typename Iterator>
struct PathGrammar 
   : boost::spirit::qi::grammar<Iterator> 
{
      template <typename TokenDef>
      PathGrammar(TokenDef const& tok)
         : PathGrammar::base_type(path)
      {
         using boost::spirit::_val; …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-spirit boost-spirit-lex

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

在什么情况下 sprintf 比 stringstream 更受欢迎?

有没有人有任何具体的例子,说明为什么在 C++ 环境中更喜欢 sprintf 而不是 stringstream?此外,如果您在 Microsoft 世界中工作,是否有任何理由更喜欢 sprintf 而非 _snprintf?

c++ visual-c++

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