- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
所以我有这个功能...
virtual void CallRemoteFunction( const char* pServerGameObjectId, const char* pFunctionName, OVariant arg1 = OVariant(), OVariant arg2 = OVariant(), OVariant arg3 = OVariant(), OVariant arg4 = OVariant(), OVariant arg5 = OVariant(), OVariant arg6 = OVariant(), OVariant arg7 = OVariant(), OVariant arg8 = OVariant(), OVariant arg9 = OVariant() );
我决定重写函数,因为坦率地说,我对此感到尴尬。该函数很简单...采用可变数量的未知类型参数并执行操作。
我是现代 C++ 的新手,所以我进行了一些搜索,并假设我会找到一些简单/优雅的新方法来执行此操作。我想象的是……
//hypothetical code
virtual void CallRemoteFunction( const char* pServerGameObjectId, const char* pFunctionName, ... args )
{
std::vector<OVariant> argsArray;
for (auto& arg : args )
{
argsArray.push_back(arg)
}
//do other stuff
}
//end hypothetical code
但在我的搜索中,我找不到任何接近的东西。那么有人可以给我一些关于如何将我的原始功能重构为更清洁或更简单的功能的想法吗?注意:解决方案必须是 C++ 11 或更早版本。
-更新-该函数不必是虚拟的。
我希望能够像这样调用函数...
CallRemoteFunction("serverID","someFunc",1,2,3);
这里是引用实现
//calls function on client if this peer is a linked server or vice versa
void Peer::CallRemoteFunction( const char* pServerGameObjectId, const char*
pFunctionName, OVariant arg1, OVariant arg2, OVariant arg3, OVariant arg4,
OVariant arg5, OVariant arg6, OVariant arg7, OVariant arg8, OVariant arg9 )
{
Command command;
command.SetObjectName( pServerGameObjectId );
command.SetFunctionName( pFunctionName );
command.ResetArgs();
if ( arg1.IsValid() ){ command.PushArg( arg1 ); }
if ( arg2.IsValid() ){ command.PushArg( arg2 ); }
if ( arg3.IsValid() ){ command.PushArg( arg3 ); }
if ( arg4.IsValid() ){ command.PushArg( arg4 ); }
if ( arg5.IsValid() ){ command.PushArg( arg5 ); }
if ( arg6.IsValid() ){ command.PushArg( arg6 ); }
if ( arg7.IsValid() ){ command.PushArg( arg7 ); }
if ( arg8.IsValid() ){ command.PushArg( arg8 ); }
if ( arg9.IsValid() ){ command.PushArg( arg9 ); }
LOG_DEBUG( "Calling Remote Function : " << pServerGameObjectId << "." <<
command.GetFunctionName() );
ByteArray buffer( command.GetSerializeSize() );
command.Serialize( buffer );
ZMQMessage* request = new ZMQMessage();//deleted when sent via zmq
request->addmem( buffer.GetBytes(), buffer.m_NumBytes );
PushMessage( MDPW_REQUEST, m_pServiceId, request );
}
最佳答案
当然,如果你愿意,你可以拥有它。您只需将模板化转发器与非模板化虚函数结合起来。
我正在使用 gsl::span
(" What is a "span" and when should I use one? ") 和一个自动 std::array
(不是原生的,以避免 0) 的特殊情况,以获得最佳的通用性、稳定性和效率。
virtual void DoCallRemoteFunction(
const char* pServerGameObjectId,
const char* pFunctionName,
gsl::span<OVariant> args
) {
...
}
template<class... ARGS>
void CallRemoteFunction(
const char* pServerGameObjectId,
const char* pFunctionName,
ARGS&&... args
) {
std::array<OVariant, sizeof...(ARGS)> arr = { OVariant{std::forward<ARGS>(args)} ... };
DoCallRemoteFunction(pServerGameObjectId, pFunctionName, arr);
}
我给了它们不同的名称,因为您可能会覆盖虚函数,并且可能不希望 API 函数被隐藏。
关于c++ - 如何实现可变虚成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50316284/
为什么禁用类型像 type t = A of int | B of string * mutable int 虽然允许此类类型: type t = A of int | B of string * i
我正在寻找一种类似结构的数据结构,我可以从中创建多个实例并具有某种类型提示而不是不可变的。 所以我有这样的东西: class ConnectionConfig(NamedTuple): nam
我需要转到引用的结构: class SearchKnot { var isWord : Bool = false var text : String = "" var to
如sec 10.4.3中所述 当控制进入执行时,执行以下步骤 功能对象F(调用者)中包含的功能代码的上下文 提供thisArg,而调用方提供argumentsList: 如
i make a game that start display Activity indicator And activity indicator bottom display UiLable wi
编辑:我在这里不断获得支持。只是为了记录,我认为这不再重要。自从我发布它以来我就不再需要它了。 我想在 Scala 中执行以下操作... def save(srcPath: String, destP
使用可变对象作为 Hashmap 键是一种不好的做法吗?当您尝试使用已修改足以更改其哈希码的键从 HashMap 中检索值时,会发生什么? 例如,给定 class Key { int a; /
如果您在Kotlin中访问List类型的Java值,则将获得(Mutable)List!类型。 例如。: Java代码: public class Example { public stati
我编写了 str 类(内置)的以下扩展,以便执行以下操作:假设我有字符串 "Ciao" ,通过做"Ciao" - "a"我想要的结果是字符串 "Cio" 。这是执行此操作的代码,并且运行良好: cla
使用可变对象作为 Hashmap 键是一种不好的做法吗?当您尝试使用已修改足以更改其哈希码的键从 HashMap 中检索值时,会发生什么? 例如,给定 class Key { int a; /
我正在为我的公司设计一个数据库来管理商业贷款。每笔贷款都可以有担保人,可以是个人或公司,在借款业务失败时作为财务支持。 我有 3 个表:Loan、Person 和 Company,它们存储明显的信息。
我使用二进制序列化从 C# 类中保存 F# 记录。一切正常: F#: type GameState = { LevelStatus : LevelStatus
import javax.swing.JOptionPane; public class HW { public static void main(String[] args) { Strin
使用 flatbuffer mutable 有多少性能损失? 是否“正确”使用 FlatBuffers 来拥有一个应该可编辑的对象/结构(即游戏状态) 在我的示例中,我现在有以下类: class Ga
std::function create_function (args...) { int x = initial_value (args...); return [x] () mut
我需要在 for 循环中找到用户输入的字符。我通常会这样做 如果(句子[i] == 'e') 但是因为在这里,'e' 将是一个单字母字符变量,我不知道如何获取要比较的值。我不能只输入 if (sent
我有一个这样的算法: let seed: Foo = ... let mut stack: Vec = Vec::new(); stack.push(&seed); while let Some(ne
这个问题可能看起来非常基础,但我很难弄清楚如何做。我有一个整数,我需要使用 for 循环来循环整数次。 首先,我尝试了—— fn main() { let number = 10; // An
如果我有以下结构: struct MyStruct { tuple: (i32, i32) }; 以及以下函数: // This will not compile fn function(&mut s
我希望在每个 session 的基础上指定列的默认值。下面的脚本不起作用,但描述了我想如何使用它。我目前使用的是 MySQL 5.5.28,但如果需要可以升级。 CREATE TABLE my_tbl
我是一名优秀的程序员,十分优秀!