T
我有一个模板,我需要在其中多次使用从说明符中用户提供的类型派生的类型noexcept
。在下面的示例中,我需要T
多次使用衰变类型。天真的方法是:
// in this case
template <typename T>
void foo(T&& t) noexcept( noexcept(typename std::decay<T>::type(std::forward<T>(t)))
&& noexcept(std::declval<typename std::decay<T>::type>() = std::forward<T>(t)))
{
typedef typename std::decay<T>::type DT;
/* ... */
}
如此频繁地重复的需要typename std::decay<T>::type
似乎过于冗长。我可以用类型替换整个表达式DT
,但不幸的是,这仅在函数体中可用。
在函数体之前引入DT
我能想到的最简单的方法是这样的:
template <typename T, typename DT = typename std::decay<T>::type>
void foo(T&& t) noexcept( noexcept(DT(std::forward<T>(t)))
&& noexcept(std::declval<DT>() = std::forward<T>(t)))
{
/* DT also available here... */
}
但是,为此目的添加另一个模板参数感觉是错误的。所以,我的问题:
- 添加额外的默认模板参数是否有任何有害的副作用?
- 这被认为是不好的做法吗?
- 有没有其他方法可以引入
DT
,以便在说明noexcept
符中可用?
编辑:在我看来,真正的问题不是获得访问权限DT
,而是完全降低noexcept
表达式的复杂性(因为它用于许多函数)。我在下面添加了一个答案,为此目的创建了一个自定义特征。