- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
假设我有以下定义嵌套类的模板类:
template <typename T>
struct foo {
struct bar { };
};
假设我正在编写代码的环境也有以下帮助程序类,它应该专门用于需要特殊处理的任何类型:
template <typename T>
struct maybeChangeType { using type = T; } /* default: same type */
我怎样才能专攻maybeChangeType
对于 foo<T>::bar
?专门针对 foo<int>::bar
很容易,但是 foo
将与 100 多种不同的 T
一起使用所以这不是一个真正的选择。
注意:请在将此问题标记为重复之前仔细阅读。这个问题不是询问一般如何专门化(例如 Understanding templates in c++ ),或者如何声明 friend ,甚至如何声明模板的 friend 。它询问如何为模板类的非模板嵌套成员声明友元(如标题所述)。
尝试以“正常”方式定义特化是行不通的,因为 foo<T>::bar
不是可推导的上下文(不好的迹象:它需要在前面 typename
):
/* error: template parameters not deducible in partial specialization */
template <typename T>
struct maybeChangeType<typename foo<T>::bar>;
将特化声明为友元也会产生编译错误:
template <typename T>
struct foo {
struct bar {
/* errors:
* - class specialization must appear at namespace scope
* - class definition may not be declared a friend
*/
template <>
friend struct maybeChangeType<bar> { using type=T; };
};
};
以上错误清楚地表明这些 friend 的实际定义必须出线:
template <typename T>
struct foo {
struct bar {
friend struct maybeChangeType<bar>;
};
};
但现在我们回到了起点:任何为 foo<T>::bar
定义特化的尝试将失败,因为它使用 bar
在不可推导的上下文中。
注意:我可以通过提供内联友元重载来解决函数的问题,但这对类没有帮助。
注意:我可以通过将内部类移出命名空间范围来解决这个问题,但这会严重污染命名空间(很多内部类用户实际上没有业务可玩)并使实现复杂化(例如,他们会不再能够访问其封闭类的私有(private)成员,并且 friend
声明的数量会激增)。
注意:我理解为什么允许任意特化名称 foo<T>::bar
是危险的/不可取的(如果 foo<T>
有 using bar = T
会怎么样),但在这种情况下 bar
实际上是 foo 确实定义的类(甚至不是模板!),因此不应该有任何 ODR 毛羽或特化会影响其他(非预期)类型的风险。
想法?
最佳答案
作为一种侵入式解决方案,可以使用函数进行类型编程(元编程)。您可以将类型函数编写为友元函数:
template<typename T> struct type_t { using type = T; };
template <typename T>
struct foo {
struct bar {
friend constexpr auto maybeChangeType_adl(type_t<bar>) -> type_t<T>
{ return {}; }
};
};
替换type_t<T>
与任何 type_t<my_type_function_result>
.定义此函数不是必需的,但有时很方便,例如用于常量表达式中的计算。 type_t
可以使用比较运算符进行增强,以替换 std::is_same<A, B>
带中缀 a == b
例如。类型type_t<T>
使用而不是 T
直接有两个原因:
maybeChangeType_adl
的定义, 有必要构造一个返回类型的对象。在 C++14 中,我会使用变量模板来实现这个功能:
template<typename T> constexpr auto type = type_t<T>{};
// ...
friend constexpr auto maybeChangeType_adl(type_t<bar>) { return type<T>; };
虽然这失去了一些对称性(参数与返回类型)。
无论哪种情况,都可以查询类型如下:
template<typename T> using inner_type = typename T::type;
template<typename T> using maybeChangeType =
inner_type<decltype(maybeChangeType_adl(type_t<T>{}))>;
回退函数 maybeChangeType
可以提供镜像 OP 中的主模板:
template<typename T> auto maybeChangeType(type_t<T>) -> type_t<T> { return {}; }
或者,您专攻 maybeChangeType
maybeChangeType_adl
存在的类模板功能:
template<typename T, typename = void>
struct maybeChangeType { using type = T; };
template<typename T>
struct maybeChangeType<T, void_t<decltype(maybeChangeType_adl(type_t<T>{}))>>
{ using type = inner_type<decltype(maybeChangeType_adl(type_t<T>{}))>; };
关于c++ - 如何为模板类中定义的类定义 friend ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32144877/
我想知道将来对我来说最简单的方法是什么,可以使查询既有效又不那么复杂。 我应该像这样保存双向关系吗 from_id=1, to_id=2from_id=2, to_id=1 或者只创建一个唯一的行 f
假设您有一个拥有十亿用户的社交网络。在每个用户的页面上,您想要显示该用户的 friend 数、 friend 的 friend 等等,最多五度。友谊是相互的。计数不需要立即更新,但它们应该是精确的。
public void notMyFriend(Student student1) { System.out.println("Friends who are not my frien
我有如下3个表格 用户 - id integer primary_key - user_name friend - id autoincrement primary_key - user1 integ
如何从 Friends 表中获取 friend 列表以及我 friend 的 friend 数(不包括我的 friend 数) friend 表"tbl_users_friends 字段 1:id字段
我的 MySQL 表结构是这样的。 USER int id varchar username FRIEND_LIST int user_id int friend_id 对于每个 friend 关系,
假设 a,b,c 和 b,d,e 和 c,f,g 和 a,e,g,h 是 friend 。所以 获取共同好友 b/w a&b: MATCH (me:User {username:'a'}) -[r:F
我正在开发“可能的 friend ”功能。我需要显示所有不是我 friend 的 friend 的 friend ,也不要发送我或没有我的待处理请求 FRIENDSHIPS user_id frien
如果两个用户是 friend ,我在“ friend ”表中有一个条目,如下所示: table: friends ------------------------ uid1
我有一个 friend 表,用于跟踪数据库中的关系 - 我将一个查询与子查询放在一起,该子查询从 friend 的 friend 那里获取个人资料信息 我的 friend 表如下所示 - id 双向出
我想结交 friend 的 friend 的 friend 。我得到了结果,但我不确定我的查询是否正确。我正在使用嵌套选择。 我的问题是: 查询是否正确? 我如何使用 join 执行此查询? 这是我的
假设我有一个包含 friend 属性的用户对象。这个 friends 属性是其他用户对象的数组,因此是你的 friend 。找到你 friend 的 friend 但不是你 friend 的最快算法是
我想结交我的 friend 以及 friend 的 friend ,但仅限于二级 friend 我的表结构是这样的 user_id friend_user_id 1 2 1
为了了解使用 Neo4J 建立 friend 关系的优势,我在 MySQL 数据库上创建了一张用于 Persons 的表(“Persons”,20900 个数据集): id | name --
假设我有一个名为“ friend ”的表,对于每个友谊,我添加两个条目。例如,如果用户 1 和 2 是 friend ,我们将有: uid1 uid2 ---------- 1 2 2 1
在我的图形数据库中,我有 Twig 和树叶。分支可以“包含”叶子,分支可以“包含”分支。 如何使用 Gremlin 找到与给定分支直接或间接相关的所有叶子? 我让这个在 Cypher 中工作: STA
我正在尝试使用 iPhone Facebook SDK 获取我 friend 的 friend 列表。我尝试了一种使用 FQL 和 Graph API 的方法,但在这两种情况下我都遇到了错误: "Ca
我有这个 MySQL 表: 假设我以用户 1 的身份登录,正在浏览用户 2 的个人资料。由于我们是共同的 friend (1 是 2 的 friend ,2 是 1 的 friend ),我需要回应“
我想得到我 friend 的 friend 不是我 friend 的 friend 。我有一张这样的 table :用户 friend (idUser,idUserFriend) 我在想这样的事情:
我有这个 Cypher 查询... match (p:Person{userid:8432})-[r:friends_with]->(p1:Person)-[r2:friends_with]->(p2
我是一名优秀的程序员,十分优秀!