所以我想假设我有以下类定义:
class my_named_int {
public:
int value;
const string name;
my_named_int(int _value, /*...Does Something Go Here...?*/);
};
Run Code Online (Sandbox Code Playgroud)
我想要的是,如果我写下面的代码:
int main() {
my_named_int my_name(5);
std::cout << my_name.name << ":" << my_name.value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我希望输出为:
my_name:5
Run Code Online (Sandbox Code Playgroud)
显然,解决这个问题的最简单方法是编写如下代码:
class my_named_int {
public:
int value;
const string name;
my_named_int(int _value, const string & _name);
};
int main() {
my_named_int my_name(5, "my_name");
std::cout << my_name.name << ":" << my_name.value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
但是,当然,这会增加我的代码的重复性.有没有办法在没有变量名称的"双重写入"的情况下在C++中执行此操作,如果是这样,我将如何处理它?
我写了以下课程:
class SomeClass {
private:
void test_function(int a, size_t & b, const int & c) {
b = a + reinterpret_cast<size_t>(&c);
}
public:
SomeClass() {
int a = 17;
size_t b = 0;
int c = 42;
auto test = std::bind(&SomeClass::test_function, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
test(a, b, c);
}
}
Run Code Online (Sandbox Code Playgroud)
就其本身而言,这段代码在IDE(Visual Studio 2015)中看起来很好,但是当我尝试编译它时,我收到以下错误:
Error C2893 Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...)' Basic Server C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\type_traits 1441
Error C2672 'std::invoke': no matching overloaded function found …Run Code Online (Sandbox Code Playgroud) 我想要做的是,如果我用一个新窗口替换我正在渲染的窗口,这可能是因为用户切换屏幕,或从全屏切换到窗口,或出于任何其他原因。
到目前为止,我的代码如下所示:
“上下文.h”
struct window_deleter {
void operator()(GLFWwindow * window) const;
};
class context {
std::unique_ptr<GLFWwindow, window_deleter> window;
public:
context(int width, int height, const char * s, GLFWmonitor * monitor, GLFWwindow * old_window, bool borderless);
GLFWwindow * get_window() const;
void make_current() const;
};
Run Code Online (Sandbox Code Playgroud)
“上下文.cpp”
context::context(int width, int height, const char * s, GLFWmonitor * monitor, GLFWwindow * old_window, bool borderless) {
if (!glfwInit()) throw std::runtime_error("Unable to Initialize GLFW");
if (borderless) glfwWindowHint(GLFW_DECORATED, 0);
else glfwWindowHint(GLFW_DECORATED, 1);
window.reset(glfwCreateWindow(width, height, s, monitor, old_window)); …Run Code Online (Sandbox Code Playgroud) 我有一个功能(简化逻辑后)采取的形式
std::tuple<font_heap, font_heap> get_font_heaps(std::vector<uint8_t> const& a, std::vector<uint8_t> const& b) {
return std::make_tuple(get_font_heap_from_data(a), get_font_heap_from_data(b));
}
Run Code Online (Sandbox Code Playgroud)
我想对这个函数进行模板化处理,以便它可以处理用户传入的数据集.
auto [serif, sansserif, monospace] = get_font_heaps(serif_data, sansserif_data, monospace_data);
auto [comic_sans] = get_font_heaps(comic_sans_data);
Run Code Online (Sandbox Code Playgroud)
我开始试图像这样重写逻辑:
template<typename ... FontDatas>
auto get_font_heaps(std::vector<uint8_t> const& data, FontData&& ...datas) {
if constexpr(sizeof...(FontDatas) == 0) {
return std::make_tuple(get_font_heap_from_data(data));
else {
return std::make_tuple(get_font_heap_from_data(data), get_font_heaps(std::forward<FontDatas>(datas)...);
}
Run Code Online (Sandbox Code Playgroud)
但很明显,即使这个编译,它也不能完全按照我想要的方式执行:它在表单中创建了一个嵌套的元组std::tuple<font_heap, std::tuple<font_heap, std::tuple<font_heap>>>,而我想要的是std::tuple<font_heap, font_heap, font_heap>
我怎样才能重写这个逻辑来做我想做的事情?我正在使用MSVC 2017.3,因此我可以访问许多C++ 17功能,但不能访问Fold Expressions(我怀疑它会大大简化逻辑).
我正在学习OpenGL,我试图绘制一个红色三角形,但我的三角形保持黑色.
这是我的片段着色器的代码:
#version 330 core
out vec4 color;
void main()
{
color = vec4(1,0,0,1);
}
Run Code Online (Sandbox Code Playgroud)
我的着色器编译没有问题,我使用这个类来使用着色器:
public class ShaderProgram
{
private final int programId;
private int vertexShaderId;
private int fragmentShaderId;
public ShaderProgram() throws Exception
{
programId = glCreateProgram();
if (programId == 0) {
throw new Exception("Could not create Shader");
}
}
public void createVertexShader(String shaderCode) throws Exception {
vertexShaderId = createShader(shaderCode, GL_VERTEX_SHADER);
}
public void createFragmentShader(String shaderCode) throws Exception {
fragmentShaderId = createShader(shaderCode, GL_FRAGMENT_SHADER);
}
protected int createShader(String shaderCode, int …Run Code Online (Sandbox Code Playgroud)