小编Dot*_*one的帖子

std::visit 相对于 if-else 的优势

我发现 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)

c++ variant c++17

8
推荐指数
1
解决办法
2418
查看次数

让构造函数返回子类

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 中使用静态方法来实现此目的,但我认为使用构造函数会更简洁。

typescript

3
推荐指数
1
解决办法
2587
查看次数

如何对 T 中可能不存在的成员使用 decltype(T::member)

我正在寻找一种方法来定义一个变量,该变量的类型取决于我的类模板化的类型的成员的类型,但需要注意的是该成员变量可能不存在。由于我仅在成员确实存在时访问块中的变量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)

c++ decltype type-traits c++-concepts c++20

3
推荐指数
1
解决办法
146
查看次数

标签 统计

c++ ×2

c++-concepts ×1

c++17 ×1

c++20 ×1

decltype ×1

type-traits ×1

typescript ×1

variant ×1