【发布时间】:2021-02-15 13:28:39
【问题描述】:
假设我有一个类模板 A,它有一个类型模板参数和一个主要特化:
template<typename T> struct A {
/*...*/
};
对于某些T 参数A<T> 将成功实例化,而对于另一些则不会。
不修改或扩展A的定义,是否可以写一个bool变量模板:
template<typename T>
constexpr bool WorksWithA = /*...*/;
如果A<T> 实例化成功,那么WorkWithA<T> 为真?
更新
将此作为单独的问题发布:Using typename in C++20 requires / concept?
#include <iostream>
template<typename T>
struct A {
using X = typename T::X;
};
template<typename T>
constexpr bool WorksWithA = requires { typename A<T>; };
struct GoodArg {
using X = int;
};
struct BadArg {
};
int main() {
std::cout << WorksWithA<GoodArg> << std::endl;
std::cout << WorksWithA<BadArg> << std::endl;
}
编译并运行:
$ clang++ --version
clang version 10.0.0-4ubuntu1
$ clang++ test.cc -std=c++20
$ ./a.out
1
1
这输出1 1,预期输出是1 0?
什么给了?
【问题讨论】:
-
听起来你可能正在寻找
std::is_constructible -
@NathanOliver:你能把模板实例化和对象构造混为一谈吗?
-
我认为没有办法检测实例化中的硬错误。因此,如果
A对 SFINAE 不友好,我认为您不能自动拥有您的WorksWithA。 -
@rustyx:对,如果 A 的定义被修改,我希望
WorksWithA(以及任何相关的机器)继续给出正确的答案而不需要修改。 -
@newbie 实例化
A产生一个类型,对象构造构造一个对象