前提:
在稍微使用了可变参数模板之后,我意识到实现稍微超出简单的元编程任务的任何东西很快变得非常麻烦.特别是,我发现自己希望的执行方式上的参数包一般操作如迭代,拆分,循环在一个std::for_each样的方式,等等.
在观看了由安德烈Alexandrescu的本次讲座由C++和超越2012年的愿望static if成C++(从借来构建d编程语言),我的感觉是某种static for会来得心应手,以及-我觉得更多的这些的static结构能带来好处.
所以我开始想知道是否有办法为变量模板函数(伪代码)的参数包实现类似的东西:
template<typename... Ts>
void my_function(Ts&&... args)
{
static for (int i = 0; i < sizeof...(args); i++) // PSEUDO-CODE!
{
foo(nth_value_of<i>(args));
}
}
Run Code Online (Sandbox Code Playgroud)
哪个会在编译时被翻译成这样的东西:
template<typename... Ts>
void my_function(Ts&&... args)
{
foo(nth_value_of<0>(args));
foo(nth_value_of<1>(args));
// ...
foo(nth_value_of<sizeof...(args) - 1>(args));
}
Run Code Online (Sandbox Code Playgroud)
原则上,static_for将允许更精细的处理:
template<typename... Ts>
void foo(Ts&&... args)
{
constexpr s …Run Code Online (Sandbox Code Playgroud) c++ iteration template-meta-programming variadic-templates c++11
我已经被困在这一段时间了,我的想法用尽了,帮助赞赏!
以下段是示例代码,以简化.
假设如下:
class Base;
class DerivedA : public Base;
class DerivedB : public Base;
Run Code Online (Sandbox Code Playgroud)
还有这个:
class Manager {
public:
std::map<std::type_index, Base*> container;
template<typename ...T>
void remove() {
// Iterate through templates somehow and...
container.erase(typeid(T));
}
}
Run Code Online (Sandbox Code Playgroud)
基本上我通过使用std :: type_index作为键,在容器中存储派生类的唯一实例.允许我这样做:
manager.remove<DerivedA>();
Run Code Online (Sandbox Code Playgroud)
话虽如此,我希望能够做同样的事情,但允许多个模板直接删除多个实例,如下:
manager.remove<DerivedA, DerivedB>()
Run Code Online (Sandbox Code Playgroud)
我知道可以迭代这里描述的可变参数模板,但我不断收到编译错误......
错误C2440:'初始化':无法从'initializer-list'转换为'std :: initializer_list'
错误C3535:无法从'initializer-list'推断出'auto'的类型
...当我尝试运行此代码时:
template<typename ...T>
void remove() {
// Iterate through templates somehow and...
auto list = {(container.erase(typeid(T)))... };
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?非常感谢你.
c++ templates initializer-list variadic-templates multiple-arguments
我有许多非常相似的函数,但使用不同数量和类型的本地对象运行:
template <class T> T* create1( const std::vector<std::string>& names )
{
A a( names[0] );
B b( names[1] );
C c( names[2] );
if ( a.valid() && b.valid() && c.valid() )
return new T( a, b, c );
else
return NULL;
}
template <class T> T* create2( const std::vector<std::string>& names )
{
D d( names[0] );
E e( names[1] );
if ( d.valid() && e.valid() )
return new T( d, e );
else
return NULL;
}
create1<ABC>( { "nameA", "nameB", …Run Code Online (Sandbox Code Playgroud)