【问题标题】:Streamlined Way of Making Template Parameters Public?使模板参数公开的简化方式?
【发布时间】:2016-09-27 07:16:16
【问题描述】:

我一直面临这样的情况,即我有一个带有一些模板参数的类,我希望通过CLASS::TYPE 公开可用。为此我总是做公共类型定义,像这样:

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

};

这很尴尬有两个原因:

  • 感觉笨重且多余
  • 为了避免遮蔽,我需要为同一事物指定两个不同的名称(TxTy),这让我很烦恼。

有更好的方法吗?

【问题讨论】:

  • 在标准库中,typedef 是一小组名称中的一个常见约定,例如,element_typevalue_typetype,基于上下文。不能说我认为这样做有很大的问题。
  • @AmiTavory 抱歉,我有点不知道这是如何回答我的问题。你能帮我多一点吗?
  • 这实际上不是一个答案,只是一个评论。 1. 如果你使用库约定,模板参数将是大写,类型是小写,所以不会发生阴影,而且,比较容易猜出类型的名称是什么。 2. 由于标准库可以做到这一点,这表明没有简单的替代方案。 ---- 再说一次,我不认为这是一个完整的答案,所以这就是我写它作为评论的原因。

标签: c++ templates typedef public


【解决方案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 时),您可以创建 deuce 函数来使用模板模板语法和可变参数模板提取任何模板类型参数:

#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
}

【讨论】:

  • 巧妙的把戏,但我认为 OP 正在寻找 less 尴尬和笨重的东西。
猜你喜欢
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
  • 1970-01-01
  • 2010-11-27
  • 2015-02-19
相关资源
最近更新 更多