sfinae 相关问题

替换失败不是错误。这是一种C ++编程技术,允许模板验证有关其模板参数的属性,从而允许在某些类型的对象可用时使用不同的特化。

函数模板正确定义前向引用数组和元素类型

最小工作示例: #包括 #包括 模板 struct is_array : std::false_type {}; 模板 结构 is_arr...

回答 1 投票 0

前向引用与右值[重复]

最小实现: #包括 #包括 模板 自动universal_ref(T&& arr) { for (自动 && v : arr) std::cout <&...

回答 1 投票 0

如何声明 SFINAE 类?

有些事情对我来说不太顺利。这是声明只接受浮点模板参数的类的方法吗? 模板 有些事情对我来说不太顺利。这是声明一个只接受浮点模板参数的类的方法吗? template <typename T, swift::enable_if<std::is_floating_point<T>::value> = nullptr> class my_float; 我无法在此类之外定义方法。无法编译,不知道为什么 您还可以使用static_assert毒害无效类型。 template <typename T> class my_float { static_assert(std::is_floating_point<T>::value, "T is not a floating point type"); // . . . }; 我认为这更直接一些。 使用其他任何一种方法,例如 template <typename T, bool = std::is_floating_point<T>::value> class my_float; template <typename T> class my_float<T, true> { /* . . . */ }; my_float<int,true> 是一个有效的表达式。我并不是说这是一个不好的方法,但如果你想避免这种情况,你必须封装 my_float<typename,bool> 在另一个模板中,以避免暴露 bool 模板参数。 嗯...不完全是SFINAE...但也许,使用模板专业化?如下? template <typename T, bool = std::is_floating_point<T>::value> class my_float; template <typename T> class my_float<T, true> { // ... }; 如果你真的想使用SFINAE,你可以写 template <typename T, typename = typename std::enable_if<std::is_floating_point<T>::value>::type> class my_float { // ... }; 或者也(观察示例中没有的指针) template <typename T, typename std::enable_if<std::is_floating_point<T>::value>::type * = nullptr> class my_float // ------------------------------------------------^ { }; --编辑-- 按照 Yakk 的建议(谢谢!),您可以混合 SFINAE 和模板专业化,为不同类型的群体开发不同版本的类。 例如以下my_class template <typename T, typename = void> class my_class; template <typename T> class my_class<T, typename std::enable_if<std::is_floating_point<T>::value>::type> { // ... }; template <typename T> class my_class<T, typename std::enable_if<std::is_integral<T>::value>::type> { // ... }; 开发有两个版本(两个不同的部分特化),第一个版本用于浮点类型,第二个版本用于整数类型。并且可以轻松扩展。 确实,这样的东西对我有用(感谢SU3的回答)。 template<typename T, bool B = false> struct enable_if {}; template<typename T> struct enable_if<T, true> { static const bool value = true; }; template<typename T, bool b = enable_if<T,is_allowed<T>::value>::value > class Timer{ void start(); }; template<typename T, bool b> void Timer<T,b>::start() { \* *** \*} 我发布这个答案是因为我不想使用部分专业化,而只想定义外部类的行为。 一个完整的可行示例: typedef std::integral_constant<bool, true> true_type; typedef std::integral_constant<bool, false> false_type; struct Time_unit { }; struct time_unit_seconds : public Time_unit { using type = std::chrono::seconds; }; struct time_unit_micro : public Time_unit { using type = std::chrono::microseconds; }; template<typename T, bool B = false> struct enable_if { }; template<typename T> struct enable_if<T, true> { const static bool value = true; }; template<typename T, bool b = enable_if<T, std::is_base_of<Time_unit, T>::value >::value> struct Timer { int start(); }; template<typename T, bool b> int Timer<T, b>::start() { return 1; } int main() { Timer<time_unit_seconds> t; Timer<time_unit_micro> t2; // Timer<double> t3; does not work ! return 0; }

回答 3 投票 0

函数模板正确定义数组和元素类型的通用引用

最小工作示例: #包括 #包括 模板 struct is_array : std::false_type {}; 模板 结构 is_arr...

回答 1 投票 0

通用引用与右值

最小实现: #包括 #包括 模板 自动universal_ref(T&& arr) { for (自动 && v : arr) std::cout <&...

回答 1 投票 0

检查成员函数是否是使用SFINAE而不是requires子句定义的

我想检查类的特定成员函数是否已定义并且同时未被 SFINAE 禁用。以下代码有效: 结构体A { int foo() { 返回 3; } }; 结构体B{}; 温度...

回答 1 投票 0

如何正确编写和应用c++20概念/SFINAE/两者通过结构定义选择函数?

请帮助我了解我做错了什么。 我正在尝试使用 RapidJSON 制作一个可序列化的变量包装器。我想提供用户定义的转换函数或使用默认的文字转换...

回答 1 投票 0

SFINAE 用于检查涉及复制赋值的复杂表达式的有效性

考虑以下类并特别注意Concrete::copy_assign: 结构类型Erased { TypeErased() = 默认值; TypeErased& 运算符=(TypeErased const& other) {...

回答 1 投票 0

如何有条件地声明类模板上的成员重载?

我正在尝试根据模板参数使用 std::enable_if 有条件地定义类模板上的成员重载: #包括 #包括 #包括<...

回答 1 投票 0

仅当类中存在类型时才定义别名和 getter/setter 函数

我获得了一组我无法更改的课程。 (出于好奇:这些是从 Simulink 模型自动生成的)不幸的是,这些类使太多的东西公开可用......

回答 1 投票 0

是否可以检查运算符是否重载<< for type or class exists?

我正在尝试检查运算符是否重载<< exists at compile time using c++17. Ideally it is supposed to be something like following: template 静态无效序列化_存储(

回答 1 投票 0

使用enable_if检查成员是否存在

这就是我正在尝试做的事情: 模板 结构模型 { 矢量 顶点; #if T 有一个 .normal 成员 无效变换(矩阵 m ) {

回答 8 投票 0

使用enable_if进行模板专门化对于函数和类的行为不同

我正在尝试使用enable_if根据模板参数的类型专门化函数模板,类似于此处的示例https://en.cppreference.com/w/cpp/types/enable_if 模板 我正在尝试使用类似于此处示例的enable_if基于模板参数的类型来专门化函数模板https://en.cppreference.com/w/cpp/types/enable_if template<typename Type, typename Enabled = void> void foo(Type t) { std::cout << "primary\n"; std::cout << std::is_same<decltype(t), A>::value << "\n"; } template<typename Type, typename std::enable_if_t<std::is_same<Type, A>::value>::type> void foo(Type t) { std::cout << "specialized\n"; } 但是在这种情况下,仅调用主要定义。如果我尝试对课程做同样的事情 template <class T, class Enable = void> struct Foo { static void bar() { std::cout << "T is blah" << std::endl; } }; template <class T> struct Foo<T, typename std::enable_if<std::is_integral<T>::value>::type> { static void bar() { std::cout << "T is int" << std::endl; } }; 它实现了预期的行为: int main() { A a; // not specializing foo<A>(a); // primary called foo(19); // primary called // does specializing Foo<int>::bar(); // int specialization is called Foo<float>::bar(); // generic is called return 0; } 有人可以向我解释一下这种差异吗?是否有一种方法可以在不使用类的情况下实现所需的行为? 我的代码示例: https://godbolt.org/z/86jsxfqdG 函数模板不能像类模板那样部分特化,它们可以重载。例如 template<typename Type> typename std::enable_if_t<!std::is_same<Type, A>::value> foo(Type t) { std::cout << "primary\n"; } template<typename Type> typename std::enable_if_t<std::is_same<Type, A>::value> foo(Type t) { std::cout << "specialized\n"; } 直播

回答 1 投票 0

ranges::view 管道运算符 - 通过将 std::variant 参数隐藏到变量->选项模式来实现 std::visit 的单子链?

我的灵感来自 std::ranges 和 std::view 及其 |有助于链接不同算法的运算符,所以我希望将 std::get_if 和 std::visit 模式打包在引擎盖下以执行 inpl...

回答 1 投票 0

C++:使用 SFINAE 检测 Visitor 中的参数类型

我正在编写一个函数,它接受以下形式的访问者: 结构访客{ void 运算符()(int i) {...} void 运算符()(const std::string& s) {...} void 运算符()(const auto& ...

回答 1 投票 0

在特征中查找任何可调用的返回类型时出现 SFINAE 错误

我正在玩 SFINAE,并尝试作为练习,获取有关“类似函数”对象(函数、函数指针、lambda 以及任何重载括号的内容)的信息

回答 1 投票 0

SFINAE 类型推导给我不完整的类型错误

我正在玩 SFINAE,并尝试作为练习,获取有关“类似函数”对象(函数、函数指针、lambda 以及任何重载括号的内容)的信息

回答 1 投票 0

std::enable_if_t typedef 替换不等效

我经常为类创建一个 this_type typedef 以缩短成员函数签名。 然而,我在使用 std::enable_if_t 时遇到了这个奇怪的情况。 #包括 #包括 #

回答 1 投票 0

输入特征来检查给定类型是否存在 istream 运算符>>

我发现了这个类型特征,可以用来检查某个类型T是否支持运算符<<: template 结构 has_ostream_operator_impl { 模板 静态

回答 1 投票 0

模板替换时访问参数包中的索引

我在C++17中有一个模板函数,其中N个第一个参数需要是整数类型,并且应该在模板替换期间检查这一点。 (对于参数来说,模板函数不应该存在...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.