简化的模板参数公开方式?

时间:2016-09-27 07:16:16

标签: c++ templates typedef public

我一直面临这样的情况:我有一个带有一些模板参数的类,我希望通过CLASS::TYPE公开提供这些参数。为此,我总是做公共typedef,如下所示:

template <class Tx>
Class C
{
public:
typedef Tx Ty;

};

由于两个原因,这很尴尬:

  • 感觉笨重而多余
  • 为了避免阴影,我需要给同一个东西提供两个不同的名字(TxTy),这真的让我感到烦恼。

有更好的方法吗?

1 个答案:

答案 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
}