这个问题建立在我的基础上:
C++ 库:.hpp + .inl(单独的定义和声明)与仅 .hpp(类内主体代码)
将模板化函数移动到内联文件中绝对是一个官方的地狱。请看以下三个例子。从我旧的整洁的做事方式(#0)到真正扩展的方式(#1),到更紧凑的方式(#2)到想象中的梦想管道方式(#3)。
// #0 the actual class definition
namespace CA {
template <typename tnChar>
class MyClass {
public:
typedef tnChar tChar;
typedef std::basic_string<tChar> tString;
MyClass(); // {}
tString Method1(const tString& aParam) const; // { return aParam; }
};
};
这是内联版本 #1。它有命名空间和类。
template <typename tnChar>
CA::MyClass<tnChar>::MyClass(){}
template <typename tnChar>
typename CA::MyClass<tnChar>::tString
CA::MyClass<tnChar>::Method1(const tString& aParam) const {
return aParam;
}
template <> // specializing
typename CA::MyClass<wchar_t>::tString
CA::MyClass<wchar_t>::Method1(const tString& aParam) const {
return aParam;
}
这是内联版本 #2。它被包装在命名空间中。从添加CA::
.
namespace CA {
template <typename tnChar>
MyClass<tnChar>::MyClass(){}
template <typename tnChar>
typename MyClass<tnChar>::tString
MyClass<tnChar>::Method1(const tString& aParam) const {
return aParam;
}
template <> // specializing
typename MyClass<wchar_t>::tString
MyClass<wchar_t>::Method1(const tString& aParam) const {
return aParam;
}
}
这是内联版本 #3。它被包装在命名空间和类中。从添加template <...>
...中保存CA::MyClass
。想象版。不可能,但可取!
#if 0 // like this is ever gonna work
// inline version #3 (IMAGINARY)
// wrapped in namespace and in class
// 'inline class' should make this functionality happen in C++my
namespace CA {
template <typename tnChar>
inline class MyClass { // :)
MyClass(){}
tString Method1(const tString& aParam) const {
return aParam;
}
};
template <>
inline class MyClass<wchar_t> { // :) - too much imagination
tString Method1(const tString& aParam) const {
return aParam;
}
};
}
#endif // disabled
我的问题是:像第 3 版这样的东西是否有可能实现?无需返回值并每次都typename
编写。template <...>
我知道我们需要这样做的原因,但我想知道 newC++11
或 nextC++14
是否有计划解决模板类内联方法分组问题?
让inline class
关键字触发#3 中的想象功能会令人兴奋,它会使外部化模板类方法变得如此简单......和逻辑......和分组......和简短:)