国际商务网站,网站建设代码标签大全,通化市建设局网站,学动漫设计好找工作吗?C17那些事开篇之类模版参数推导(CTAD) 引入 大家好#xff0c;我是光城#xff0c;今天开始正式开篇C17的新特性了#xff0c;期待不#xff0c;欢迎留言区说出想要更新的特性呀#xff5e; C模板元编程一直是C开发者们熟知的一项功能#xff0c;无论是初学者还是高级开发… C17那些事开篇之类模版参数推导(CTAD) 引入 大家好我是光城今天开始正式开篇C17的新特性了期待不欢迎留言区说出想要更新的特性呀 C模板元编程一直是C开发者们熟知的一项功能无论是初学者还是高级开发者都能够通过它编写具有类型参数的通用代码。随着C17引入的类模板参数推导CTAD处理类模板的过程变得更加直观和灵活。 本节所有代码也会更新于社群中。 C17引入CTAD会带来如下好处 例如这么复杂的代码 std::vectorFooBarint, const char* obj{a, b, c}; 我们只需要 std::vector obj{a, b, c}; 再比如 std::tupleint 可以简化为 std::tuple t1{1}; 所以咱们今天来看看CTAD。 CTAD全称是Class template argument deduction (CTAD)类模版参数推导你给定编译器一个推导指南(deduction guide)我们便可以使用这个特性了。 如果不给定如下面例子 #include iostream
template typename T, typename U
struct MyPair {T first{};U second{};
};int main() {MyPairint, int p1{1, 2};MyPair p2{1, 2};std::cout p1.first , p1.second std::endl;std::cout p2.first , p2.second std::endl;return 0;
} 对于p2我们便会报错 no viable constructor or deduction guide for deduction of template arguments of MyPair 那么对于怎么修改呢 只需要添加deduction guid即可如下写法即可。 template typename T, typename U
MyPair(T, U) - MyPairT, U; 类模板参数推导CTAD通过允许编译器从构造函数参数中推导出模板参数简化了类模板的实例化过程。在引入CTAD之前开发者在实例化时必须明确指定模板参数。然而通过CTAD这种明确的指定变得不再必要从而使代码更易读、易维护。 template typename T
class Add{private:T first;T second;public:Add() default;Add(T first, T second): first_{first}, second_{second} {}T result() const { return first second; }
};int main(){Add one(1,2); // T被推导为intAdd two{1.245, 3.1415}; // T被推导为doubleAdd three {0.24f, 0.34f}; // T被推导为float
} 在上面的示例中CTAD允许类型T基于构造函数参数被推导消除了显式类型指定的需求。 非静态成员初始化 但是有个场景用不了CTAD那就是非静态成员初始化。例如Test类中使用外面的MyPair就必须写全。 template typename T int, typename U int
struct MyPair {T first{};U second{};
};template typename T, typename U
MyPair(T, U) - MyPairT, U;class Test {MyPair p4; // use of class template MyPair requires template arguments; argument// deduction not allowed in non-static class member
}; 在上面的例子中我们定义了一个模板类MyPair并在其中使用了CTAD。然而当我们尝试在类Test中使用MyPair作为非静态成员时由于非静态成员初始化的上下文CTAD将无法正常工作导致编译错误。在这种情况下我们必须显式指定MyPair的模板参数。 我们可以看到在非静态成员初始化的上下文中CTAD无法推导模板参数。因此在类模板作为非静态成员时开发者需要显式指定所有的模板参数。这一点需要在实际开发中特别注意以确保代码的正确性和可维护性。 欢迎与我一起交流学习C那些事相关源码与资料已更新社群。