小编OnM*_*uck的帖子

实现作为仿函数的功能的优点和缺点

我正在和一位同事讨论一个只有一个公共方法的简单类的API.我最初去了:

class CalculateSomething
{
public:
  void operator()(const SomeObject &obj) const;

private:
  // ...
}
Run Code Online (Sandbox Code Playgroud)

但是,我的同事反对使用operator(),并且为了清楚起见,希望简单地将方法命名为'calculate'.虽然我没有发现这个论点令人信服,但它让我想到了利弊.

优势运营商()

  • 这门课程很精简,有一个明确的目的.一旦实例化,它基本上充当自由函数.
  • 它是一个仿函数,可以很容易地使用(例如STL算法).
  • 当使用范围算法时,可以直接传递对象而不是通过函数指针,这使编译器能够内联代码.虽然不能保证,但通过函数指针完全禁止这种可能性.

缺点operator()

  • 如果不查看类名,该方法的作用就不太清楚了.(我个人不同意,因为班级只有一种方法,因此从班级名称中明确其含义)
  • 预计STL中的大多数算子都是无国籍的.我认为这是阻碍我的主要原因......

我很惊讶地看到我对此的搜索并没有带来太大的影响,因为我认为这是一个非常常见的情况(一类,一类责任).因此,我真的很想听听其他人对此的看法.

c++ oop functor design-guidelines

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

编译时间调度:以有效调用为条件

鉴于以下代码:

template<typename GroupA, typename GroupB>
class JoinedObjectGroup
   : public _ObjectSpaceHolder<GroupA>
   , public _ObjectSpaceHolder<GroupB>
   {
   public:
      JoinedObjectGroup(GroupA &groupA, GroupB &groupB)
         : _ObjectSpaceHolder<GroupA>(groupA)
         , _ObjectSpaceHolder<GroupB>(groupB)
         {
         }

      template<typename ObjectType>
      ObjectType get()
         {
            // Dispatch to appropriate handler: only one of the following actually compiles as
            // either GroupA knows about ObjectType or GroupB, but not both. So:
            //
         // return static_cast<_ObjectSpaceHolder<GroupA> &>(*this).m_objectSpace.get<ObjectType>();
            //  or
            // return static_cast<_ObjectSpaceHolder<GroupB> &>(*this).m_objectSpace.get<ObjectType>();
         }
   };
Run Code Online (Sandbox Code Playgroud)

get()调用中,我想对适当的处理程序执行编译时调度.根本的想法是ObjectType通过GroupA或通过GroupB.我最初的方法如下:

template<typename ObjectType>
ObjectType …
Run Code Online (Sandbox Code Playgroud)

c++ sfinae c++11

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

重载函数调用编译时常量

我有兴趣知道是否可以区分使用编译时常量提供的参数的函数调用和没有编译时常量的函数调用?

例如:

int a = 2;
foo( a )  // #1: Compute at run-time
foo( 3 )  // #2: Compute at compile-time
Run Code Online (Sandbox Code Playgroud)

有没有办法提供区分这两种情况的重载?或者更一般地说,我如何检测文字类型的使用?

我查看了constexpr,但函数参数不能是constexpr.拥有相同的调用语法会很巧妙,但能够根据文字类型的参数生成不同的代码.

c++ c++11

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

使用多个外键连接 SQLAlchemy 关系

使用 SQLAlchemy,我无法弄清楚如何映射以下关系:用户可以被其他用户“关注”,从而成为具有“关注者”的“领导者”。

class User( Base ):
    __tablename__ = 'users'
    id = Column( Integer, primary_key = True )
    followers = relationship( 'User', primaryjoin = 'and_( User.id == UserFollower.leader_id )', cascade = 'all' )
    leaders = relationship( 'User', primaryjoin = 'and_( User.id == UserFollower.follower_id )', cascade = 'all' )

class UserFollower( Base ):
    __tablename__ = 'users_followers'
    leader_id = Column( Integer, ForeignKey( 'users.id' ), primary_key = True )
    follower_id = Column( Integer, ForeignKey( 'users.id' ), primary_key = True )
    follower = relationship( 'User', …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy

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

如何避免嵌套事务

我目前正在实现一些依赖于SQLite数据库的功能.在这样做的同时,我遇到了一个我没想到的限制.这让我想知道我是否正确地解决了我的问题.我希望有人可以建议一种考虑到要求的不同方法.

目标

目标是尽可能快地将大量对象存储到数据库中.但是,如果在任何时候确定不应该存储这些对象,则操作不应对数据库产生任何影响.确切的存储查询('插入')取决于先前的插入.

用例

考虑一个非常大的'实例信息包'集合,每个包代表一些相应抽象实例的知识的一部分.因此,总集合代表了一个或多个抽象实例的完整知识.每个包的信息包括:

  1. instance_id; 用于唯一标识此信息所涉及的抽象实例.
  2. 属性图; (attribute_uri,attribute_value)-pairs其中attribute_uri唯一标识属性,attribute_value是对应的文本值.

instance_id和attribute_id都可以在表中找到,分别是TBL_INSTANCES和TBL_ATTRIBUTES.这里使用的数据库模型是EAV模型.

插入后,表TBL_ENTRIES应包含以下格式的条目:

[ entry_id | instance_id | attribute_id | attribute_value ]
Run Code Online (Sandbox Code Playgroud)

问题

实施似乎很简单:

  1. 设置保存点
  2. 开始交易
  3. 为TBL_ENTRIES中的许多插入准备语句
  4. 对于集合中的每个实例:
    • 4.1.在TBL_INSTANCES中查找instance_id.如果不存在,请将其添加到TBL_INSTANCES
    • 4.2.对于实例的属性映射中的每个属性:
      • 4.2.1.在TBL_ATTRIBUTES中查找attribute_id.如果不存在,请将其添加到TBL_ATTRIBUTES.
      • 4.2.2.添加TBL_ENTRIES条目
  5. 如果在任何时候发生错误,则回滚到保存点,否则提交.

不幸的是,在查找步骤(4.1和4.2.1)中,SQLite报告"无法在事务中启动事务"错误.阅读文档,似乎是查找调用sqlite3_exec例程的事实,除非我错了,似乎在内部设置了一个事务.

如果不允许嵌套事务,我应该如何执行查找步骤(基本上是"INSERT OR REPLACE"表达式后跟"SELECT"查询)?有没有办法避免它们或在当前事务中使用sqlite3_exec?如果没有,我是否以错误的方式处理我的问题?也许我不应该使用单独的整数作为键,例如直接使用attribute_uri作为键而不是查找相应的attribute_id.

在任何情况下,我仍然需要在事务期间做一些等效的事情,因为真正的速度增益在于准备实例集合上的语句,而不是属性集合:实例可能只有一个或两个属性而实例数量在实例集合中总是会非常大.

我正在使用C/C++,SQLite 3.7.

对我的方法的任何建议或评论非常感谢!

sqlite database-design relational-database

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

decltype和静态模板方法

在尝试使用SFINAE时,以下代码无法编译:

template<typename ObjectType, typename GroupA, typename GroupB, typename = void>
struct DelegateImpl; // default version

template<typename ObjectType, typename GroupA, typename GroupB>
struct DelegateImpl<ObjectType, GroupA, GroupB, decltype(GroupA::get<ObjectType>())>; // specialization
Run Code Online (Sandbox Code Playgroud)

GCC:

错误:模板参数4无效

使用MSVC,一个令人惊讶的更有帮助:

错误C3553:decltype期望表达式不是类型

我的目标是让编译器在表达式GroupA::get<ObjectType>()有效时选择特化.

问题:如何将decltype与静态模板方法一起使用?

c++ sfinae c++11

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