将文字字符串作为模板参数传递不好
Is passing literal string as template parameter not good
我正在做一个 C++ 项目,我刚刚定义了一个函数,如下所示:
template<typename... Args>
void func(Args&&... args) {}
然后,这样称呼它:
func("abc"); // char[4]?
func("de"); // char[3]?
我的问题是编译器是否会推导出两个独立的函数,一个用于char[4]
,另一个用于char[3]
?如果我像上面那样用const char*
调用很多func
,编译器会生成很多独立的函数?
这是愚蠢的吗?我应该避免这种情况吗?
其实func("abc")
和func(std::string("abc"));
对我来说完全一样
所以我应该像 func(std::string("abc"));
和 func(std::string("de"));
那样调用这个函数,这样编译器将只生成一个函数 void func(const std::string&);
顺便说一句,我的项目是用 C++14 开发的。
My question is if the compiler will deduce two independent functions, one is for char[4] and the other is for char[3]?
会的。
If I call many func with const char* as above, the compiler will generate many independent functions?
您不会用 const char*
调用 func
。如果您只使用 const char*
调用 func
,那么函数模板将只有一个实例化。
您使用 const char[4]
和 const char[3]
调用函数,这会导致单独的实例化。每个唯一的模板参数集都会有一个实例化。
Is this stupid? Should I avoid this?
取决于用例。在许多情况下,优化器只是简单地扩展所有内联调用,并且实例化不会在生成的程序集中留下任何理论上存在的痕迹。
我正在做一个 C++ 项目,我刚刚定义了一个函数,如下所示:
template<typename... Args>
void func(Args&&... args) {}
然后,这样称呼它:
func("abc"); // char[4]?
func("de"); // char[3]?
我的问题是编译器是否会推导出两个独立的函数,一个用于char[4]
,另一个用于char[3]
?如果我像上面那样用const char*
调用很多func
,编译器会生成很多独立的函数?
这是愚蠢的吗?我应该避免这种情况吗?
其实func("abc")
和func(std::string("abc"));
对我来说完全一样
所以我应该像 func(std::string("abc"));
和 func(std::string("de"));
那样调用这个函数,这样编译器将只生成一个函数 void func(const std::string&);
顺便说一句,我的项目是用 C++14 开发的。
My question is if the compiler will deduce two independent functions, one is for char[4] and the other is for char[3]?
会的。
If I call many func with const char* as above, the compiler will generate many independent functions?
您不会用 const char*
调用 func
。如果您只使用 const char*
调用 func
,那么函数模板将只有一个实例化。
您使用 const char[4]
和 const char[3]
调用函数,这会导致单独的实例化。每个唯一的模板参数集都会有一个实例化。
Is this stupid? Should I avoid this?
取决于用例。在许多情况下,优化器只是简单地扩展所有内联调用,并且实例化不会在生成的程序集中留下任何理论上存在的痕迹。