Jump to content
  • Advertisement
Sign in to follow this  

Can you overload the assignment operator to take multiple values? [FIXED]

This topic is 2259 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

This is something I've been curious about. Say with certain structs/classes, you can define them while declaring them by assigning them to multiple values contained within curly braces. For instance, with the COORD struct:


COORD position = {0, 0, 0};


How do you do this in code? Or is this some strange special case? I can't find anything on the subject.


EDIT: I really should code before I speak. I'm pretty sure you can just define all the variables once you declare a struct, and it'll go down the list of the struct's variables, so if I were to have a similar struct, let's say Vector, with X, Y, and Z values, you would be able to declare and define a variable of its type with Vector = {0,0,0}; This doesn't work for assignment though, for some reason. Is there a way to do that?

Edited by StoneMask

Share this post

Link to post
Share on other sites

If you're got access to C++11's initializer lists, there's no magic required. This functionality is now built into the language.


Also, that code doesn't call the assignment operator. Initialization upon creation is done not with the assignment operator, but with the constructor (and subsequently the copy constructor, though to extra copy is typically elided).


Long story short, that code you wrote will get handled as if it were written:


COORD position(COORD({0, 0, 0})); // operator= is never used

// Note the above copy often is elided, and thus the code becomes "COORD position({0, 0, 0});" (but the copy construct is still required to be available, or else you'll get a compile time error)


And unless you've got C++11's initializer lists, you can't do that.


As for your question, operator= is a binary operator, and cannot take any more (or less) than 2 arguments.

Edited by Cornstalks

Share this post

Link to post
Share on other sites

Semi-relevantly, here's a function I use in my code base for formatting strings.

	Creates a string from 'str', with every occurance of "%n" replaced with the nth argument.
	Example: String::Format("The time is now %1 on the %3 of %2", {time, month, day})
std::string Format(std::string text, const StringList &arguments)
	StringList symbols = {"%1", "%2", "%3", "%4", "%5", "%6", "%7", "%8", "%9", "%10", "%11", "%12", "%13", "%14", "%15"};
	unsigned int i = 0;
	for(const auto &arg : arguments)
		if(i <= symbols.size())
			text = String::ReplaceAll(text, symbols[i], arg);
	return text;

It takes advantage of C++11's curly-bracket "uniform initialization syntax" to initialize a std::vector<std::string> (typedef'd to StringList since I use them so frequently).

Just a quick and sloppy implementation that works fairly well. It could be optimized further (it's very Schlemiel at the moment), but I haven't needed to yet.


But yes, uniform initialization syntax works for other types:

#include <iostream>
struct Point
     int x = 0; //default value of 0
     int y = 0;
int main()
     Point point = {640, 480};
     std::cout << point.x << ", " << point.y << std::endl;
     return 0;


Try the code


It works, for example, in C++11's new tuple types. C++11 must be enabled on your compiler for you to have access to the new features. How you enable it varies from compiler to compiler, but for GCC/MinGW you pass in -std=c++11 (or -std=c++0x for older versions of GCC).

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!