使模板参数公开的简化方法

Streamlined Way of Making Template Parameters Public?

本文关键字:方法 参数      更新时间:2023-10-16

我一直面临这样的情况:我有一个类,它接受一些模板参数,我想通过CLASS::TYPE公开可用。为此,我总是使用公共类型定义,像这样:

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

这很尴尬,有两个原因:

  • 感觉笨拙和冗余
  • 为了避免阴影,我需要给同一个东西两个不同的名字(TxTy),这真的让我很困扰。

有更好的方法吗?

您可以使用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
}