V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
shylockhg
V2EX  ›  问与答

c++可以实现去掉一层模板么

  •  1
     
  •   shylockhg · 2019-11-06 12:57:49 +08:00 · 1330 次点击
    这是一个创建于 1604 天前的主题,其中的信息可能已经有所发展或是发生改变。

    就是这样

    typename unwrap<std::vector<int>>::type // int
    

    我这里粗糙的试了一下好像不行

    #include <type_traits>
    #include <vector>
    
    template <typename T>
    struct unwrap {
    	using type =  T;
    };
    
    template <typename wrapper, typename T>
    struct unwrap<wrapper<T>> {
    	using type = T;
    };
    
    int main(int argc, char* argv[]) {
    	typename unwrap<std::vector<int>>::type a = 0;
    }
    
    
    4 条回复    2019-11-06 14:57:49 +08:00
    codehz
        1
    codehz  
       2019-11-06 13:18:26 +08:00 via Android
    template<template <typename> X, typename T>
    就可以匹配模板模板了,不过对于这个例子,vector 的完整形式有两个 typename,所以还要写一个 typename 才能匹配上
    codehz
        2
    codehz  
       2019-11-06 13:29:36 +08:00   ❤️ 1
    前面少了一个 typename,下面是完整例子
    https://gist.github.com/codehz/b18c62d104f2b7f1a4f3bfb44c5d249b
    shylockhg
        3
    shylockhg  
    OP
       2019-11-06 14:56:05 +08:00
    @codehz 翻不了墙。
    codehz
        4
    codehz  
       2019-11-06 14:57:49 +08:00
    @shylockhg #3
    #include <vector>

    template <typename T>
    struct unwrap {
    using type = T;
    };

    template <template <typename> typename wrapper, typename T>
    struct unwrap<wrapper<T>> {
    using type = T;
    };

    template <template <typename, typename> typename wrapper, typename T, typename R>
    struct unwrap<wrapper<T, R>> {
    using type = T;
    };

    int main() {
    typename unwrap<std::vector<int>>::type a = 0;
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1667 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 16:46 · PVG 00:46 · LAX 09:46 · JFK 12:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.