#include <cstdint>
#include <chrono>
#include <iostream>
#include <atomic>
#include <thread>
#include <vector>

using namespace std;
using namespace std::chrono;
typedef duration<float> fsec;

auto started = steady_clock::now();
atomic<int> counter = 0;

inline int GetNumber()
{
	return ++counter;
}

inline int64_t SigmaN(int64_t n) // to avoid overflow
{
	return n * (n + 1) >> 1;
}

int SerialN(int n)
{
	for (int i = 0; i < n ; ++i)
	{
		if (SigmaN(i) == n)
			return i;
	}

	return 0;
}

int IsPerfectSquare(int n)
{
	if (n < 0)
		return 0;

	int root = (int)(sqrt(n));

	return n == root * root ?
					root : 0;
}

void Work()
{
	while (true)
	{
		int number = GetNumber();

		if (0 > number)
			break; // until overflow

		int root = IsPerfectSquare(number);

		if (0 < root)
		{
			auto last_of_serial = SerialN(number);

			if (0 < last_of_serial)
			{
				//print elapsed time
				printf("%d = %d^2 = sum(1..%d)n %0.2f secn",
					number, root, last_of_serial,
					duration_cast<fsec>(steady_clock::now() - started).count()
					);
			}
		}
	}//while
}



int main (void)
{
	const size_t sizeofThread = 9;

	vector<thread> workers;

	for (int i = 0; i < sizeofThread; ++i)
	{
		workers.push_back(thread(Work));
	}

	for (auto& t : workers)
		t.join();
}

굳이 멀티스레드로 돌려본건 cpu 100% 찍어본지가 오래됬기땜에..

stringstream을 fstream으로 내보낼 때,

fstream file;
stringstream ss;

file << ss; // 스트림 자체를 덤프할 뿐 스트림 안의 내용이 기록되지 않는다.
file << ss.rdbuf(); // 스트림 안의 버퍼를 덤프한다. 파일에 내용이 제대로 작성된다.

stringstream으로 입력받을 때도 마찬가지. 흔히 내장 타입에 받듯 >>연산자를 사용하지 않고 raw buffer를 그대로 stringstream에 “출력“한다.

fstream file;
stringstream ss;

ss << file.rdbuf(); //보기엔 별로 좋지 않아도 최선의 효율적인 방식.

gtest1.6을 vs2012에서 빌드하면
error C2977: ‘std::tuple’ : too many template arguments

따위의 에러를 마구 뱉는다. 스택오버플로에서 찾아보면 MS 블로그의 링크를 주는데, C++11 core feature 중 하나인 variadic template을 VC11이 제대로 지원하지 않기 때문이라고 한다.

Faux Variadic 항목을 참고해 _VARIADIC_MAX=10 정도로 매크로를 정의하면 일단 빌드할 수 있다.