1

这个问题建立在我的基础上

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 中的想象功能会令人兴奋,它会使外部化模板类方法变得如此简单......和逻辑......和分组......和简短:)

4

1 回答 1

1

冒着明显的风险,在类体内声明成员函数时可以使用该语法。如果您的宗教要求您将成员函数放在单独的.inl文件中,您可以将该文件包含在类主体本身中。

于 2013-08-05T18:31:21.523 回答