如何解决可变参数模板的代码大小问题
我正在创建一个算法,可以同时处理许多不同的用户定义类型。假定这些类型中的每一种都有一个 func1
和 func2
,它们将作为 MyAlgorithm
的接口。我可以使用可变参数模板来做到这一点:
template <typename... Args>
class MyAlgorithm{
// interact with Args using func1 and func2
};
我现在可以像 MyAlgorithm
那样实例化 MyAlgorithm<A,B,C,D,E,F,G>
。这有效,但是,我觉得对于我的应用程序来说,这可能会导致 MyAlgorithm
的太多专业化。在实践中,MyAlgorithm
可以先实例化,如 MyAlgorithm<A,A,D>
,然后是 MyAlgorithm<A,D>
,然后是 MyAlgorithm<C,F D>
,依此类推。
不幸的是,模板针对 Args
的每个组合进行了实例化。这会产生问题,例如在在线设置中。 MyAlgorithm
可以在批量实时输入数据上运行(MyAlgorithm
的性质是它在批量而不是单个输入上运行)。将解析实时输入数据并调用正确的 MyAlgorithm
特化。在这种情况下,用户需要在编译后的代码中创建所有可能的 MyAlgorithm
特化。
MyAlgorithm<A>;
MyAlgorithm<B>;
MyAlgorithm<C>;
MyAlgorithm<A,A>;
MyAlgorithm<A,B>;
MyAlgorithm<A,C>;
MyAlgorithm<B,A>;
...
我有一个想法可能会有所帮助,但我的想法并不完全正确。它将处理一个专门用于 MyAlgorithm
的模板 Proxy
类,而不是 A,Cs
接受模板参数。
// no template
class MyAlgorithm{
// interact with Proxy using func1proxy and func2proxy
std::vector<Proxy> Args;
};
template<typename T>
class Proxy{
// define func1proxy and func2proxy using Arg's func1 and func2
std::unique_ptr<T> Arg; // only member
};
当然这行不通,因为每个 Proxy
特化是不同的类,所以 MyAlgorithm
仍然需要是模板类(并且 std::vector<Proxy> Args
不能存在)。
是否有我想做的设计模式?有没有减少类实例化次数的设计模式?
一些注意事项:
MyAlgorithm
将所有模板参数视为相同。该算法对每个模板参数递归调用 func1
和 func2
。
class MyAlgorithm{
template<typname T,typename... Args>
void CallFunc1s(T first,Args... rest){
T.func1();
SomeFunction(rest);
}
};
解决方法
类型擦除要被func1/func2调用的类型T。
struct proxy_ref{
void* pdata=0;
void(*pfunc1)(void*)=0;
void(*pfunc2)(void*)=0;
template<class T>
proxy_ref(T&& t):
pdata((void*)std::addressof(t)),pfunc1([](void*pvoid){
((T*)pvoid)->func1();
}),pfunc2([](void*pvoid){
((T*)pvoid)->func2();
})
{}
void func1(){ pfunc1(pvoid); }
void func2(){ pfunc2(pvoid); }
};
现在采用 proxy_ref
的向量并在它们上调用 func1
和 func2
。
您的特定问题可能涉及更复杂的签名,甚至是值类型而不是引用类型。
有像您这样的类型擦除无法解决的问题,但尝试这是第一步。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。