我的目标是创建一个仿函数类型类,它可以保存函数的参数,以便它可以在以后执行它。这个想法是将参数打包到 atuple
中,然后将它们解包到func
函数中。这是一个包含一些复制/移动问题的综合示例,但现在就可以了。MSVC++ 2012 CTP 编译器难以处理以下代码。
#include <tuple>
#include <string>
using namespace std;
template<int... I>
struct Sequence {};
//make this pass the package to func, which will do nothing with it
template<typename... Args>
struct Dispatcher{
//A tuple that holds all of the arguments
tuple<Args...> argPackage;
//A constructor that fills the tuple with arguments
template<typename... CArgs>
Dispatcher(CArgs&&... args) : argPackage(forward<Args>(args)...) {}
//A function that takes the arguments and does nothing
template<typename... Args>
void func(Args&&... args){}
//A function that unpackes the tuple into func(), MSVC can't do this but GCC can
template<int... I>
void dispatch(Sequence<I...>){ //line 25
func(forward<Args>(get<I>(argPackage))...);
}
};
int main(){
Dispatcher<string,string,string> d("str1","str2","str3");
d.dispatch(Sequence<2,1,0>());
system("pause");
}
编译器给出了这个错误:
1>c:\users\jeremy\documents\visual studio 2012\projects\test\test\main.cpp(25): fatal error C1001: An internal error has occurred in the compiler.
1> (compiler file 'msc1.cpp', line 1453)
1> To work around this problem, try simplifying or changing the program near the locations listed above.
现在为辩护,编译器确实会发出以下警告。
Microsoft Visual C++ Compiler Nov 2012 CTP' 仅用于测试目的
我没有用 测试过这个确切的代码g++
,但是我的主要项目已经成功编译,g++
其中包含在更复杂的场景中相同的方法。
我可以做些什么来使编译器上的这个调度函数更容易,这样它就不会崩溃?我是否应该手动将调度功能展开到某个点而不是使其成为 vardiadic 模板?如果是这样,我怎样才能一次手动解包一个Args
类型?