小编sky*_*ack的帖子

operator->重复,直到返回非类类型的值

根据13.3.1.2/8,或更好的脚注-129(强调我的):

[...]重复该过程,直到operator->函数返回非类类型的值.

我以为我知道它是如何operator->工作的(让我说,它基于返回类型的递归方式),但我发现我完全不知道它如何工作的(我的意思是它的返回类型).

当我找到它时,我想知道是否可以真正定义和使用类似于double operator->()通用结构的东西S,因为我从未以这种方式使用过这样的运算符.
例如,请考虑以下代码:

struct S { 
    constexpr double operator->() noexcept {
        return 3.14;
    }
};

int main() {
    static_assert(3.14 == S{}.operator->(), "!");
}
Run Code Online (Sandbox Code Playgroud)

语法非常难看,我看不到使用这样的运算符或类似运算符.

让程序员从这个运算符返回a double或a 的真正目的是什么float
什么可能是他们的用途?

c++ operator-overloading return-type

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

实现一个模板函数,该函数将两个类作为模板参数,如果继承则返回true

下面是我遇到的代码,它实际上是std::is_base_of在C++ 11或C++中完成的boost::is_base_of.

辅助函数下面也是这样的:

template<typename D, typename B>
class IsDerivedFromHelper
{
   class No { };
   class Yes { No no[3]; };

   static Yes Test( B* );
   static No Test( ... );
public:
    enum { Is = sizeof(Test(static_cast<D*>(0))) == sizeof(Yes) };

};


template <class C, class P> 
bool IsDerivedFrom() {
 return IsDerivedFromHelper<C, P>::Is;
}
Run Code Online (Sandbox Code Playgroud)

有人能解释一下enum的Is作用吗?

什么是静态Yes Test 和静态No Test?它们是功能调用吗?

c++ templates c++11

4
推荐指数
1
解决办法
1021
查看次数

CMake如何包括没有源头?

这可能是一个虚拟的问题,但我从字面上看google的前两个页面都没有成功。
我正在编写仅标头的库,并且无法正确设置CMake配置,以便在构建解决方案时给定的main.cpp查找正确的包含。
如何做到这一点?

编辑

因此,我可能应该给出更详细的解释。
可以说我有一个./src文件夹:./src/core./src/wrappers。在每个文件夹中,我都有一些.h文件需要包含在main.cpp文件中:

#include <src/core/reader.h>
Run Code Online (Sandbox Code Playgroud)

仍然当我输入CMakeList.txt类似的内容时:

include_directories(src/core)
add_executable(main main.cpp)
Run Code Online (Sandbox Code Playgroud)

我收到类似src/core/reader.h这样的消息:没有这样的文件或目录。

c++ cmake header-files

4
推荐指数
2
解决办法
1536
查看次数

typename,类型成员和非类型成员:它是有效的代码吗?

请考虑以下代码:

struct S {
    struct type {};
    type type;
};

int main() {  
    typename S::type t;
    (void) t;
}
Run Code Online (Sandbox Code Playgroud)

除了这个事实远非一个好主意之外,我在这里阅读了另一个问题后进行了实验.
我发现上面的代码片段被GCC编译没有错误,并且被clang 3.9拒绝,并出现以下错误:

错误:typename说明符引用'S'中的非类型成员'type'

我怀疑在这种情况下clang是正确的并且GCC是错误的(实际上,我正在向后者开放一个问题).
这是正确的结论还是有效使用typename


注意:我不是在问如何解决它,我知道该怎么做.我只询问这段代码是否有效.

c++ gcc clang typename language-lawyer

4
推荐指数
1
解决办法
520
查看次数

是否有标准的静态函数包装类型模板?

我正在寻找一个标准的C++ 14类型模板,静态地(在编译时)嵌入一个函数引用作为模板参数,并实现operator()作为对引用函数的转发调用.

我知道std::function存在,但它将函数指针存储为数据成员.我希望将函数引用嵌入到类型签名中,以便包装器类型为默认可构造.

我有一个工作实现(使用示例用例):

#include <cstring>
#include <iostream>
#include <memory>

// Implementation:

template <typename Ret, typename... Args>
struct fn_t {
    template <Ret (Func)(Args...)>
    struct fn_ref {
        Ret operator () (Args &&...args) const {
            return Func(std::forward<Args>(args)...);
        }
    };
};

// Example use case:

template <typename T>
using unique_c_ptr = std::unique_ptr<T, fn_t<void, void *>::fn_ref<std::free>>;

int main() {
    // { char *, void (*)(void *) } (16 bytes)
    std::unique_ptr<char[], decltype(&std::free)> ptr1(::strdup("Hello"), &std::free);

    // { char …
Run Code Online (Sandbox Code Playgroud)

c++ c++14

4
推荐指数
1
解决办法
130
查看次数

带模板的条件返回类型

我想在C++中使用与模板相关的条件返回类型.我的环境中提供了C++ 11,14和17预览版.

我不是编程新手,但我是C++的新手,并且对某些功能有点困惑.

我想要实现的是:

如果模板是int32_t我的返回类型会int64_t,int16_t将返回int32_tint8_t会返回一个int16_t.

实际上我正在使用通用模板:

template <class T, class T2>
static T2 Foo(T bar1, T bar2) { //do something }

int64_t x = Foo<uint32_t, uint64_t>(555555, 666666);
Run Code Online (Sandbox Code Playgroud)

我想通过只输入参数类型来使这更加实用.

int64_t x = Foo<uint32_t>(555555, 666666);
int32_t x = Foo<uint16_t>(12000, 13000;
int16_t x = Foo<uint8_t>(88, 99);
Run Code Online (Sandbox Code Playgroud)

我尝试用以下方法实现它std::conditional:

template<typename OtherType,
        typename T = typename std::conditional<(sizeof(Type) <=   
        sizeof(OtherType)),
        OtherType, Type>::type>
Run Code Online (Sandbox Code Playgroud)

我愿意使用重载和疯狂的想法.

c++ conditional templates

4
推荐指数
1
解决办法
778
查看次数

JavaFX 8如何设置程序图标以发出警报?

如何在不使用的情况下将程序图标设置为警报alert.initOwner()?为什么没有initOwner?这是因为在初始化整个窗口之前必须显示一些警报,所以没有可以启用的场景initOwner

java javafx javafx-8

4
推荐指数
2
解决办法
3254
查看次数

C ++-使用没有模板参数的模板类中的枚举

template<typename T> class SomeClass{

public:
    enum SomeEnum{ SOME_FLAG};

};

SomeClass::SomeEnum some_enum =      SomeClass::SomeEnum::SOME_FLAG;       //NO
SomeClass<int>::SomeEnum some_enum = SomeClass::SomeEnum::SOME_FLAG;       //NO
SomeClass<int>::SomeEnum some_enum = SomeClass<int>::SomeEnum::SOME_FLAG;  //YES
Run Code Online (Sandbox Code Playgroud)

这不会编译,因为

类SomeClass,不带模板参数

没有模版参数,没有办法/解决方法使用它,有点使该类的枚举成为全局类,因此它不依赖于该参数。

不是我不能输入它们,而是它们可能又长又复杂,代码将更难阅读,在这里我不能使用诸如auto之类的东西。(我是模板的新手,如果这个问题很me脚,抱歉。)

c++ templates

4
推荐指数
1
解决办法
1183
查看次数

可选的嵌套类和 is_constructible 之间奇怪的交互

在处理现实项目时,我偶然发现了某些(某些版本)编译器的奇怪行为。考虑以下类声明:

struct OptionalsStruct {
    struct InnerType {
        bool b{};
    };

    OptionalsStruct() = default;

    std::optional<InnerType> oInnerType;
};
Run Code Online (Sandbox Code Playgroud)

对于某些编译器,它OptionalStruct::InnerType不可构造的,但不可构造默认可构造的clang 1116GCC 10),对于其他一些编译器,它既不是不可构造的clang 910),更不用说clang 8如何看待整体事物。

我的问题是:这些行为是编译器错误,还是标准中的漏洞(我使用的是 C++17)?我在这里错过了什么吗?

c++ inner-classes type-traits c++17

4
推荐指数
1
解决办法
192
查看次数

O(nlogn)算法用于查找包含其他范围的范围

如果你有一个范围类似的n个范围,[1,4.5]你怎么能找到任何索引是否O(nlogn)及时包含另一个索引?注意:[x,y]完全包含[a,b]if x >= ab <= y.

这似乎可以与合并排序类似地进行,您可以检查是否有任何范围在范围总量的每一半中包含另一个范围,然后比较任一半中的任何范围是否包含另一半的范围.我的问题是我无法找到O(n)最后一部分的方法.我猜我会以某种方式组合一些范围,但我想不出如何.

algorithm

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