我发现 std::visit 可以按以下方式使用:
std::visit([](auto&& arg) {
using T = std::decay_t<decltype(arg)>;
if constexpr (std::is_same_v<T, int>)
std::cout << "int with value " << arg << '\n';
else if constexpr (std::is_same_v<T, std::string>)
std::cout << "std::string with value " << std::quoted(arg) << '\n';
else
static_assert(always_false_v<T>, "non-exhaustive visitor!");
}, v);
Run Code Online (Sandbox Code Playgroud)
但相反,我想我也可以使用
if(auto x = std::get_if<int>(&v))
std::cout << " is int " << *x << std::endl;
else if(auto x = std::get_if<std::string>(&v))
std::cout << " is String " << *x << std::endl;
else
std::cout << "non-exhaustive visitor!" …Run Code Online (Sandbox Code Playgroud) class A{
constructor(input: string) {
// do stuff
}
f() {console.log("A")}
}
class B extends A{
constructor(input: string) {
// do stuff
}
f() {console.log("B")}
}
class C extends A{
constructor(input: string) {
// do stuff
}
f() {console.log("C")}
}
Run Code Online (Sandbox Code Playgroud)
我目前有以下设置。这可能听起来很奇怪,但我想new A(inp)根据输入调用返回 B 或 C 的实例(即使它是as A根据 TypeScript 返回的),以便调用(new A("B")).f()将打印“B”,与传递“C”相同,而默认为“A”。这是否可能以一种不严重违反任何规定的方式实现?目前我在 A 中使用静态方法来实现此目的,但我认为使用构造函数会更简洁。
我正在寻找一种方法来定义一个变量,该变量的类型取决于我的类模板化的类型的成员的类型,但需要注意的是该成员变量可能不存在。由于我仅在成员确实存在时访问块中的变量constexpr,因此我不关心声明它或它是什么类型。但是,我了解到这typename conditional<hasMember<T>, decltype(T::member), int>不起作用,因为未使用的分支仍然需要编译。
这是我希望开始工作的一个例子:
#include <iostream>
using namespace std;
struct X{};
struct Y{string member;};
template<class T>
concept hasMember = requires (T t) {t.member;};
template<class T>
struct A{
void hi(T a) {
// stuff
typename conditional<hasMember<T>, decltype(T::member), int /*member is unused if hasMember<T> is false, so I don't care what type it is or if it exists*/>::type member;
if constexpr (hasMember<T>){
member = a.member;
}
// stuff
if constexpr (hasMember<T>){
std::cout << member<< std::endl;
}
}; …Run Code Online (Sandbox Code Playgroud)