英文:
Can I write a concept to test for the existence of a "templated member"
问题
- 可以编写一个概念来检查成员是否为模板吗(而不只是尝试任意特化)?
例如,检查类型是否包含一个接受模板参数的函数 zug<T>(T)
。
struct SNoZug {};
struct SZug
{
template <typename T> // (A)
void zug(T) {};
};
template <typename T>
concept has_zug = ???; // << 可以吗?
static_assert(!has_zug<SNoZug>);
static_assert(has_zug<SZug>);
- 如果 (A) 使用概念参数(例如:
template <some_other_concept T>
),这能做到吗? - 如果
zug
(A)使用可变参数,这能做到吗? - 如果
zug
使用值参数,这能做到吗? - 如果
zug
使用自动参数,这能做到吗? - 如果
zug
使用模板模板参数,这能做到吗? - 如果
zug
是成员类而不是成员函数,这能做到吗?
注意:相关未回答的问题:https://stackoverflow.com/questions/72522317/check-the-existence-of-a-member-function-template-in-a-concept-definition。
注意:这里有一些针对可能相关问题的提出的代码,但我不确定它是否是有效的 C++:https://stackoverflow.com/questions/68238264/c20-template-template-concept-syntax/68381246#comment134010477_68381246。
英文:
- Is it possible to write a concept to check for the existence of a member that is a template (without just trying an arbitrary specialization)?
For example, check if the type contains a function zug<T>(T)
taking a template parameter.
struct SNoZug {};
struct SZug
{
template <typename T> // (A)
void zug(T) {};
};
template <typename T>
concept has_zug = ???; // << CAN THIS BE DONE?
static_assert(!has_zug<SNoZug>);
static_assert(has_zug<SZug>);
- Can this be done if (A) uses a concept parameter (eg:
template <some_other_concept T>
)? - Can this be done if
zug
(A) uses a variadic parameter? - Can this be done if
zug
uses a value parameter? - Can this be done if
zug
uses an auto parameter? - Can this be done if
zug
uses a template template parameter? - Can this be done if
zug
was a member class instead of a member function?
NOTE: Related unanswered question: https://stackoverflow.com/questions/72522317/check-the-existence-of-a-member-function-template-in-a-concept-definition.
NOTE: There's some proposed code for a potentially related problem here, but I'm not sure if it's valid C++: https://stackoverflow.com/questions/68238264/c20-template-template-concept-syntax/68381246#comment134010477_68381246.
答案1
得分: 1
你可以检查.zug<int>(0)
是否有效,或者检查任何固定的实例化(包括那些是其他模板参数的函数)。
这将与测试.zug()
的方式相同。
你不能在尝试实例化之前检查通用模板。
在C++添加反射功能后可能会变得可能。
英文:
You can check for .zug<int>(0)
being valid, or any fixed instantiation (including those that are functions of the other template arguments).
This will work the same as testing for .zug()
would.
You cannot check for a generic template without trying to instantiate.
It may be possible after reflection is added to C++ to do so.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论