2017-10-08 69 views
7

过了一段时间,我又发现模板模板参数的一个功能。见例如下面的代码片断:有没有办法在模板模板参数中推导别名模板,同时仍然保留其被推断上下文的属性

template <template <class> class TT, class T> 
void foo(TT<T>) { 
} 

template <class T> 
using typer = T; 

int main() { 
    foo<typer>(int{}); 
} 

别名模板传递给模板为模板模板参数并用于进一步检测,因为它是推导出上下文模板的其它参数。美女!

然而就当别名模板本身需要进行推断它看起来像编译器都疯了:

template <template <class> class> 
struct tag{}; 

template <template <class> class TT, class T> 
void foo(tag<TT>, TT<T>) { 
} 

template <class T> 
using typer = T; 

int main() { 
    foo(tag<typer>{}, int{}); 
} 
当然

[live demo]

编译器是正确的TT可以从两个tag<TT>推断以及如TT<T>参数foo,而int{}与具有类型参数模式的模板模板不匹配。有没有办法保留T的扣除上下文,但在TT<T>中使TT未推导出上下文?

P.S.我的意图是纯粹的,这只是一个理论问题,不存在背后的问题。

+0

老实说,我看不出任何使用第一_beautifulne ss_也不是第二次尝试。无论如何,这个问题很有趣,+1。 – skypjack

+0

@skypjack正如我所说我甚至没有考虑可能的用法,所以你可能是没有任何... –

回答

2

,我认为它会更容易/更清晰的写类似:

template <template <class> class TT, class T> 
void foo(tag<TT>, T, std::enable_if_t< std::is_same<T,TT<T>>::value >* = 0) 

或较少受限

template <template <class> class TT, class T> 
void foo_impl(tag<TT>, TT<T>){} 

template <template <class> class TT, class T> 
void foo(tag<TT> a, T b){ foo_impl<TT>(a, b); } 

作为一个方面说明,这表明(非规范)说明该标准声称一个别名模板名称是从来没有推论有些不准确......