1

我的目标是创建一个仿函数类型类,它可以保存函数的参数,以便它可以在以后执行它。这个想法是将参数打包到 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类型?

4

0 回答 0