我正在和一位同事讨论一个只有一个公共方法的简单类的API.我最初去了:
class CalculateSomething
{
public:
void operator()(const SomeObject &obj) const;
private:
// ...
}
Run Code Online (Sandbox Code Playgroud)
但是,我的同事反对使用operator(),并且为了清楚起见,希望简单地将方法命名为'calculate'.虽然我没有发现这个论点令人信服,但它让我想到了利弊.
我很惊讶地看到我对此的搜索并没有带来太大的影响,因为我认为这是一个非常常见的情况(一类,一类责任).因此,我真的很想听听其他人对此的看法.
鉴于以下代码:
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) 我有兴趣知道是否可以区分使用编译时常量提供的参数的函数调用和没有编译时常量的函数调用?
例如:
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.拥有相同的调用语法会很巧妙,但能够根据文字类型的参数生成不同的代码.
使用 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) 我目前正在实现一些依赖于SQLite数据库的功能.在这样做的同时,我遇到了一个我没想到的限制.这让我想知道我是否正确地解决了我的问题.我希望有人可以建议一种考虑到要求的不同方法.
目标
目标是尽可能快地将大量对象存储到数据库中.但是,如果在任何时候确定不应该存储这些对象,则操作不应对数据库产生任何影响.确切的存储查询('插入')取决于先前的插入.
用例
考虑一个非常大的'实例信息包'集合,每个包代表一些相应抽象实例的知识的一部分.因此,总集合代表了一个或多个抽象实例的完整知识.每个包的信息包括:
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)
问题
实施似乎很简单:
不幸的是,在查找步骤(4.1和4.2.1)中,SQLite报告"无法在事务中启动事务"错误.阅读文档,似乎是查找调用sqlite3_exec例程的事实,除非我错了,似乎在内部设置了一个事务.
题
如果不允许嵌套事务,我应该如何执行查找步骤(基本上是"INSERT OR REPLACE"表达式后跟"SELECT"查询)?有没有办法避免它们或在当前事务中使用sqlite3_exec?如果没有,我是否以错误的方式处理我的问题?也许我不应该使用单独的整数作为键,例如直接使用attribute_uri作为键而不是查找相应的attribute_id.
在任何情况下,我仍然需要在事务期间做一些等效的事情,因为真正的速度增益在于准备实例集合上的语句,而不是属性集合:实例可能只有一个或两个属性而实例数量在实例集合中总是会非常大.
我正在使用C/C++,SQLite 3.7.
对我的方法的任何建议或评论非常感谢!
在尝试使用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与静态模板方法一起使用?