根据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
?
什么可能是他们的用途?
下面是我遇到的代码,它实际上是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
?它们是功能调用吗?
这可能是一个虚拟的问题,但我从字面上看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
这样的消息:没有这样的文件或目录。
请考虑以下代码:
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++ 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++ 11,14和17预览版.
我不是编程新手,但我是C++的新手,并且对某些功能有点困惑.
我想要实现的是:
如果模板是int32_t
我的返回类型会int64_t
,int16_t
将返回int32_t
并int8_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)
我愿意使用重载和疯狂的想法.
如何在不使用的情况下将程序图标设置为警报alert.initOwner()
?为什么没有initOwner
?这是因为在初始化整个窗口之前必须显示一些警报,所以没有可以启用的场景initOwner
。
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脚,抱歉。)
在处理现实项目时,我偶然发现了某些(某些版本)编译器的奇怪行为。考虑以下类声明:
struct OptionalsStruct {
struct InnerType {
bool b{};
};
OptionalsStruct() = default;
std::optional<InnerType> oInnerType;
};
Run Code Online (Sandbox Code Playgroud)
对于某些编译器,它OptionalStruct::InnerType
是不可构造的,但不可构造或默认可构造的(clang 11到16和GCC 10),对于其他一些编译器,它既不是不可构造的(clang 9和10),更不用说clang 8如何看待整体事物。
我的问题是:这些行为是编译器错误,还是标准中的漏洞(我使用的是 C++17)?我在这里错过了什么吗?
如果你有一个范围类似的n个范围,[1,4.5]
你怎么能找到任何索引是否O(nlogn)
及时包含另一个索引?注意:[x,y]
完全包含[a,b]
if x >= a
和b <= y
.
这似乎可以与合并排序类似地进行,您可以检查是否有任何范围在范围总量的每一半中包含另一个范围,然后比较任一半中的任何范围是否包含另一半的范围.我的问题是我无法找到O(n)
最后一部分的方法.我猜我会以某种方式组合一些范围,但我想不出如何.
c++ ×8
templates ×3
algorithm ×1
c++11 ×1
c++14 ×1
c++17 ×1
clang ×1
cmake ×1
conditional ×1
gcc ×1
header-files ×1
java ×1
javafx ×1
javafx-8 ×1
return-type ×1
type-traits ×1
typename ×1