2017-10-08 145 views
0

是否可以使用模板类指针来声明模板函数?类似这样的:C++ 11/14/17:模板类指针作为模板参数

template <typename FirstType, typename ... TypesRemaining> 
class MyClass 
{ 
    // ... 
}; 

template <int n, template <typename FirstType, typename ... TypesRemaining> typename MyClass<FirstType, TypesRemaining...>::*ptr> myFunction() { 
    // ... 
} 

是否可以使用'using'来声明指针类型?事情是这样的:

template <typename FirstType, typename ... TypesRemaining> 
class MyClass 
{ 
    // ... 
}; 

template<typename FirstType, typename ... TypesRemaining> 
using ptrMyClass = MyClass<FirstType, TypesRemaining...>*; 

template <int n, template <typename FirstType, typename ... TypesRemaining> typename ptrMyClass<FirstType, TypesRemaining...> ptr> myFunction() { 
    // ... 
} 
+0

什么,如果你正在尝试做的问题这个? – user0042

+0

以上所有代码都不能编译。我不知道如何做正确的语法来实现相同的东西。 – Aesope

回答

1

你可以做这样的事情(编译罚款铿锵,使用gcc ICE):

template <typename FirstType, typename... TypesRemaining> 
class MyClass 
{ 
    // ... 
}; 

template<int n, auto ptr> class 
myFunction_impl; 

template 
< 
    int n 
, typename FirstType 
, typename... TypesRemaining 
, MyClass<FirstType, TypesRemaining...> * ptr 
> class 
myFunction_impl<n, ptr> 
{ 
    public: static void 
    impl(void) 
    { 
     // ... 
    } 
}; 

template<int n, auto ptr> auto 
myFunction(void) 
{ 
    return(myFunction_impl<n, ptr>::impl()); 
} 

int main() 
{ 
    myFunction<0, static_cast<MyClass<int, int, int> *>(nullptr)>(); 
    return 0; 
} 

Online compiler link

+0

感谢您的回答。我忘了说我被Visual Studio(至少2017年)困住了。我试图编译你的代码,它不适用于VS.我收到myFunction_impl类的消息,说明模板声明是“无法识别的模板声明/定义”(我怀疑参数包不在最后)。另外,我想更好地理解您的解决方案。为什么你需要有一个中级的实施?感谢你的宝贵时间。 – Aesope

+0

不幸的是VS还没有对最新标准提供适当的支持。中级类的实现允许定义一个部分专业化推导'FirstType'和'TypesRemaining',这对于函数是不可能的。如果你真的不需要他们,那么不需要中级班。 – VTT