我一直面临这样的情况:我有一个带有一些模板参数的类,我希望通过CLASS::TYPE
公开提供这些参数。为此,我总是做公共typedef,如下所示:
template <class Tx>
Class C
{
public:
typedef Tx Ty;
};
由于两个原因,这很尴尬:
Tx
和Ty
),这真的让我感到烦恼。有更好的方法吗?
答案 0 :(得分:1)
您可以使用decltype
语法,演绎和标记调度:
template <class Tx>
struct C { };
template <class T>
struct tag { };
template <class T>
T deduceCTx(tag<C<T>>);
// now to extract type:
decltype(deduceCTx(tag<C<int>>{})) a; // a is of type int
在更一般的情况下(以及至少使用c ++ 11时),您可以使用模板模板语法和可变参数模板创建演绎函数来提取任何模板类型参数:
#include <tuple>
template <class Tx>
struct C { };
template <class T>
struct tag { };
template <size_t N, template <class...> class TT, class... Args>
typename std::tuple_element<N, std::tuple<Args...>>::type
deduceAnyTypeTemplateParameter(tag<TT<Args...>>);
// now to extract type:
decltype(deduceAnyTypeTemplateParameter<0>(tag<C<int>>{})) a; // a is of type int
如果您使用的是c ++ 14,则可以通过使用类型别名来更方便地使用您的演绎:
#include <tuple>
template <class Tx>
struct C { };
template <class T>
struct tag { };
template <size_t N, template <class...> class TT, class... Args>
typename std::tuple_element<N, std::tuple<Args...>>::type
deduceAnyTemplateParameter(tag<TT<Args...>>);
// now to use passed type:
decltype(deduceAnyTemplateParameter<0>(tag<C<int>>{})) a; // a is of type int
template <size_t N, class T>
using TemplateParameter = decltype(deduceAnyTemplateParameter<N>(tag<T>{}));
int main() {
TemplateParameter<0, C<int>> i; // i of type int
}