実行時にテンプレートタイプが解決されているにもかかわらず、以下のコンパイル/実行がなぜ発生するのか理解しようとしています。コンパイラにvoid f<double>(double)
とvoid f<std::string>(std::string)
を作成するように指示するのに、f
だけを呼び出すのはif/else
で十分ですか?実行時の関数テンプレートタイプの控除
test.hpp
#include <type_traits>
#include <string>
#include <iostream>
template <typename T>
void f(T x) {
if(std::is_same<T, std::string>::value)
std::cout << "String: " << x;
}
TEST.CPP
#include <iostream>
#include "test.hpp"
int main(int, char** argv) {
double x(std::stod(argv[1]));
if(x < 42) f(x);
else f(std::to_string(x));
return 0;
}
$ (clan)g++ -std=c++14 test.cpp
$ ./a.exe 41
$ ./a.exe 43
String: 43.000000
ifおよびelseブランチの両方に対してコードが生成されます。実行時に、 'x'の値に応じて適切なブランチが実行されます。 –