std::any根据本Wiki中提供的规范实现C++ 17时,我偶然发现了一些对我来说荒谬的事情:
在自由函数的定义中std::any_cast,用于从std::any实例中检索值,提供了r值引用的重载(它是第三个):
template< class ValueType >
ValueType any_cast(any&& operand); // (3)
Run Code Online (Sandbox Code Playgroud)
现在,在概要下面列出的要求适用于重载2和3(这也意味着包括r值重载):
2-3)返回*any_cast<std::remove_reference_t<ValueType>>(&operand)
该定义似乎实际上不允许移动数据!
函数调用只是重定向到基于指针的重载; 有关临时性质的信息operand 丢失了!
是不是我不能离开任何一个实例?这只是wiki中的一个错误吗?我错了吗?
在实现C++ 1z std::basic_string_view以在较旧的编译器上使用它时,我遇到了流输出操作符重载的问题.基本上,它必须输出string_viewwhile 引用的内容而不依赖于任何存在的null-terminator(因为string_view不保证是以null终止的).
通常,编写重载operator<<非常容易,因为您可以依赖已经存在的重载,因此不需要使用SO中此问题中提到的 sentry对象.
但在这种情况下,没有预定义的重载来operator<<获取字符指针和长度(显然).因此,我std::string在当前的实现中创建了一个临时实例:
template< typename TChar, typename TTraits >
auto operator<<(::std::basic_ostream<TChar, TTraits>& p_os, basic_string_view<TChar, TTraits> p_v)
-> ::std::basic_ostream<TChar, TTraits>&
{
p_os << p_v.to_string(); // to_string() returns a ::std::string.
return p_os;
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,但我真的不喜欢我必须创建一个临时std::string实例的事实,因为这需要冗余地复制数据和动态内存的潜在用法.至少在我看来,这违背了使用轻量级引用类型的目的.
所以我的问题是:
在没有开销的情况下为string_view实现正确格式化输出的最佳方法是什么?
在研究时,我发现LLVM是这样的:(在这里找到)
// [string.view.io]
template<class _CharT, class _Traits>
basic_ostream<_CharT, _Traits>&
operator<<(basic_ostream<_CharT, _Traits>& __os, basic_string_view<_CharT, _Traits> __sv)
{
return _VSTD::__put_character_sequence(__os, …Run Code Online (Sandbox Code Playgroud) 我在clang运行ArchLinux的系统上使用版本4.0.0,它总是工作正常,但最近我无法编译使用某些STL头文件的程序!
细节:
产量clang --version:
clang version 4.0.0 (tags/RELEASE_400/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Run Code Online (Sandbox Code Playgroud)
产量gcc --version:
gcc (GCC) 7.1.1 20170528
Run Code Online (Sandbox Code Playgroud)
例:
我尝试编译以下简单的程序:
#include <functional>
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用以下命令:
clang++ -std=c++1z test.cxx
结果就是失败:
In file included from test.cxx:3:
In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/functional:60:
In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/unordered_map:47:
In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/bits/hashtable.h:37:
In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/bits/node_handle.h:39:
/usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/optional:1032:27: error: use of
class template 'optional' requires template arguments
template <typename _Tp> …Run Code Online (Sandbox Code Playgroud) 我最近开始尝试各种模板技巧.在这种情况下,我尝试使用参数包实现一个包含由可变参数模板提供的数字序列的类.
但是,我遇到了一些问题,这些问题在我使用的编译器(英特尔C++ 14)上没有发生,但在其他问题上,如CLang或GCC.因此,我很困惑哪个编译器在解释标准时"更加重要".
这是我的代码:
#include <iostream>
using namespace std;
template< size_t... Sequence >
class CSequence
{
public:
CSequence()
{
this->generate< Sequence... >();
this->out();
}
private:
// Recursion end
template< size_t N >
void generate(size_t sz)
{
// Create array
this->m_Array = new size_t[sz+1];
this->m_Len = sz+1;
this->m_Array[sz] = N;
}
// Recursion segment
template< size_t N, size_t... Ns >
void generate(size_t sz)
{
generate<Ns...>(sz+1);
this->m_Array[sz] = N;
}
// Recursion start
template< …Run Code Online (Sandbox Code Playgroud) 注意:此问题中提供的示例不是生产代码,根本没有任何意义.它只是在那里说明我的问题.
我正在测试它的可能性decltype,特别是如果它用于推断函数参数类型,并遇到了一个问题:
假设有两个类结构如下:
struct ClassInt
{
// Note: no default ctor
ClassInt(int value)
: m_Value(value)
{}
int m_Value;
};
struct ClassDouble
{
// Note: no default ctor
ClassDouble(double value)
: m_Value(value)
{}
double m_Value;
};
Run Code Online (Sandbox Code Playgroud)
现在,我写了一个函数(以某种方式)通过字符串检索一个type参数的实例(应该是上面的一个),并为其m_Value成员分配一个给定的值:
template< typename Ty >
Ty* get_fake_ptr() { return nullptr; }
// Retrieve pointer to Ty object by name and assign its value member.
// The problem is that we don't actually have an instance of Ty at the point
// …Run Code Online (Sandbox Code Playgroud) 在实现 std::experimental::optional(cppreference.com)时,我对特定构造函数的规范感到困惑,即:
constexpr optional( const T& value ); // (4)
Run Code Online (Sandbox Code Playgroud)
(来源)
optional<T>对于易于破坏的类型T,该构造函数允许在constexpr上下文中构造.虽然第一个要求,即在这种情况下关闭用户提供的析构函数来制作optional<T>文字类型,直接解决,我不知道如何绕过constexpr中不允许的放置限制.
我认为我应该实现optional<T>使用std::aligned_storage<T>以允许T不是默认构造的类型并满足任何对齐要求(如果适用).但正如我所说,constexpr禁止我在特定构造函数中使用placement new.
我喝咖啡多少,而且我没有看到明显的解决方案吗?
谢谢
我目前正在尝试为我的应用程序创建一个基于CMake的构建系统,该系统使用SDL2作为其图形输出.但是当使用MSYS构建Mingw32-w64时,我收到了非常奇怪的错误消息.
考虑以下示例项目.它使用在github上findSDL2.cmake找到.(只是一个空函数和a )main.cxxmain#include <SDL2.h>
# Version requirement and project info
cmake_minimum_required(VERSION 3.1.3)
project(app)
# Try to find libsdl2
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/cmake)
find_package(SDL2 REQUIRED)
message(STATUS "Include directory: " ${SDL2_INCLUDE_DIR})
message(STATUS "Libraries: " ${SDL2_LIBRARY})
# Define target as executable
add_executable(app main.cxx)
# Include own include files
target_include_directories(app PUBLIC ${SDL2_INCLUDE_DIR})
# Link to libraries
target_link_libraries(app ${SDL2_LIBRARY})
# Require support for at least C++14.
set_property(TARGET app PROPERTY CXX_STANDARD 14)
set_property(TARGET app PROPERTY CXX_STANDARD_REQUIRED ON)
Run Code Online (Sandbox Code Playgroud)
在我的测试系统上,使用MSYS为Mingw64构建,安装了SDL2:
katharina@k-pc MINGW64 /d/app
$ …Run Code Online (Sandbox Code Playgroud) 我有一个 Android 应用程序,它使用 aGlSurfaceView在片段内渲染 3D 全屏场景。我在分析器中注意到,它GlSurfaceView实际上运行了两次(在两个线程中),占用资源并降低 FPS。我通过将相同的 OpenGL 场景(使用相同的Renderer实现)渲染到动态壁纸并对其进行分析来确认该问题,该场景仅运行一次。
我在这里做错了什么吗?
代码如下:
我的SurfaceView
class MySurfaceView(ctx: Context): GLSurfaceView(ctx)
{
init
{
setEGLContextClientVersion(3)
preserveEGLContextOnPause = true
setRenderer( /* instantiating the renderer class */ )
}
}
Run Code Online (Sandbox Code Playgroud)
OpenGL片段
class OpenGLFragment: Fragment()
{
private lateinit var glView: GLSurfaceView
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View?
{
this.glView = MySurfaceView(this.activity)
return this.glView
}
}
Run Code Online (Sandbox Code Playgroud)
主要活动
class MainActivity : FragmentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) …Run Code Online (Sandbox Code Playgroud) 着色器编译失败时,是否需要删除着色器?失败的着色器也包括在这个过程中吗?
像这样:
for(size_t Size = 0; Size < this->Shaders.size(); Size++) //"Shaders" is a vector.
{
glDeleteShader(this->Shaders[Size]);
}
Run Code Online (Sandbox Code Playgroud)